2012-07-01 105 views
4

所以没有,这不是做事情的最好方法。然而,为了理论的缘故,,如何成功地将指针值分配给匿名结构的指针?C++匿名结构指针赋值

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

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

生产:

错误C2440: '=':无法从 '无符号字符*' 转换到 '<无名型oTwoShort> *'

示例假定msg本身就是一个有效的指针。

这可能吗?既然你没有实际的类型,你甚至可以强制转换吗?

回答

11

您可以decltype获取类型:

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

此溶液中加入C++ 11的,因此它将不适用于较旧的编译器。 Boost的实现大致相同(BOOST_PROTO_DECLTYPE),旨在与较老的编译器一起工作。它有一些限制(例如,如果内存提供服务,则每个作用域只能使用一次),但无论如何它可能总比没有好。

+1

BOOST_PROTO_DECLTYPE是否适用于没有链接的类型(如匿名类型)?我找不到任何确凿的文档,并试图提出一个可能的实现我总是遇到这样的问题,即不能将不具有链接的类型用作C++ 03中的模板参数,即使它是从一个从函数参数。 –

+0

@CharlesBailey:好问题。说实话,现在你提到它,我怀疑我曾经尝试过将它与一个没有链接的类型一起使用,所以我不确定。 –

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

但是,真的吗?

+1

似乎是最便携,更-所以比使用'decltype'。 – Qix

+2

@ Di-0xide,“但是,真的吗?” – Griwes

+0

@Griwes - 哈哈。就像我在OP中所说的那样,这仅仅是为了理论的缘故。 :]我不*实际*实现像这样的结构。 – Qix

7

我认为你必须使用C++ 11的decltype

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

优雅,但不适用于较低版本的VC++。 – Qix

+1

+1。好答案! –

+1

@ Di-0xide:是的,它是C++ 11特有的。 –

0

至于说你不能这样做指针转换,但你可以这样做:

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

该规范指出指针类型不必是相同的大小,所以这在技术上是未定义的行为。 – Qix