所以没有,这不是最好的做事方式。但是,为了理论,如何成功地将指针值分配给匿名结构的指针?
#pragma pack(push,1)
struct
{
__int16 sHd1;
__int16 sHd2;
} *oTwoShort;
#pragma pack(pop)
oTwoShort = (unsigned char*)msg; // C-Error
产生
错误C2440:'=':无法从'unsigned char *'转换为 “<未命名型oTwoShort> *'
该示例假定msg
本身就是一个有效的指针。
这可能吗?既然你没有实际类型,你甚至可以进行类型转换吗?
答案 0 :(得分:11)
您可以使用decltype
获取类型:
oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg);
这是在C ++ 11中添加的,因此它不适用于较旧的编译器。 Boost的实现大致相同(BOOST_PROTO_DECLTYPE
),旨在与较旧的编译器一起使用。它有一些限制(例如,如果内存服务,每个范围只能使用一次),但无论如何它可能总比没有好。
答案 1 :(得分:7)
我认为你必须使用C ++ 11的decltype
:
oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg);
答案 2 :(得分:5)
reinterpret_cast<unsigned char*&>(oTwoShort) = reinterpret_cast<unsigned char*>(msg);
但是,真的吗?
答案 3 :(得分:0)
如上所述,您无法进行指针投射,但您可以这样做:
memcpy(&oTwoShort,&msg,sizeof(void*));