C++匿名结构体指针赋值

4

所以,这不是最好的做法。然而,为了理论的完整性,如何成功地将指针值分配给匿名结构体的指针?

#pragma pack(push,1)
    struct
    {
        __int16 sHd1;
        __int16 sHd2;
    } *oTwoShort;
#pragma pack(pop)

    oTwoShort = (unsigned char*)msg; // C-Error

产生:

错误 C2440: '=' : 无法将类型为“unsigned char *”的表达式转换为类型“<未命名类型-oTwoShort> *”

该示例假定msg本身是有效指针。

这个可能吗?由于你没有实际类型,你能进行类型转换吗?

4个回答

11

您可以使用 decltype 获取类型:

oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg);

尽管如此,这是在C++11中添加的,因此它无法与旧编译器一起使用。Boost有一个实现大致相同的功能(BOOST_PROTO_DECLTYPE),旨在与旧编译器配合使用。 它有一些限制(例如,如果记忆没错,您只能在每个作用域中使用它一次),但总比没有强。


1
BOOST_PROTO_DECLTYPE 是否适用于没有链接的类型(例如匿名类型)?我找不到任何确定性文档,并且在尝试想出可能的实现时,我总是遇到一个问题:即使从函数参数中推断出来,C++03 中不能将没有链接的类型用作模板参数。 - CB Bailey
@CharlesBailey:好问题。说实话,既然你提到了,我怀疑我从来没有尝试过将其与没有链接的类型一起使用,所以我不确定。 - Jerry Coffin

7

我认为你需要使用C++11的decltype

oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg);

1
@Di-0xide:是的,它是特定于C++11的。 - CB Bailey

6
reinterpret_cast<unsigned char*&>(oTwoShort) = reinterpret_cast<unsigned char*>(msg);

但是,真的吗?


1
似乎是最便携的,甚至比使用 decltype 还要更加便携。 - Qix - MONICA WAS MISTREATED
@Griwes - 哈哈。就像我在原帖中说的那样,这只是为了理论而已。:] 我并没有真正实现这样的结构体。 - Qix - MONICA WAS MISTREATED

0

正如所说,您不能进行指针转换,但是您可以这样做:

memcpy(&oTwoShort,&msg,sizeof(void*));

规范说明指针类型不必具有相同的大小,因此这在技术上是未定义的行为。 - Qix - MONICA WAS MISTREATED

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接