4

いいえ、これは物事を行うための最良の方法ではありません。しかし、理論上、匿名構造体のポインターにポインター値をうまく割り当てるにはどうすればよいでしょうか。

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

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

生成:

エラーC2440:'=':'unsignedchar*'から'<unnamed-type-oTwoShort>*'に変換できません

msgこの例では、それ自体が有効なポインターであると想定しています。

これは可能ですか?実際の型がないので、型キャストすることもできますか?

4

4 に答える 4

11

次のようにタイプを取得できますdecltype

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

ただし、これはC ++ 11で追加されたため、古いコンパイラでは機能しません。BOOST_PROTO_DECLTYPEBoostには、古いコンパイラで動作することを目的としたものとほぼ同じ()の実装があります。いくつかの制限があります(たとえば、メモリが機能する場合、スコープごとに1回しか使用できません)が、とにかく何もないよりはおそらく良いでしょう。

于 2012-07-01T13:31:22.853 に答える
7

私はあなたがC++11を使わなければならないと思いますdecltype

oTwoShort = reinterpret_cast<decltype(oTwoShort)>(msg);
于 2012-07-01T13:31:06.393 に答える
6
reinterpret_cast<unsigned char*&>(oTwoShort) = reinterpret_cast<unsigned char*>(msg);

しかし、本当に?

于 2012-07-01T13:30:17.537 に答える
0

言ったように、ポインタキャストを行うことはできませんが、これを行うことはできます。

memcpy(&oTwoShort,&msg,sizeof(void*));
于 2016-06-24T20:25:19.383 に答える