2

C++/CLI では、offsetof マクロが機能しないようです。

これは、アンマネージ C++ では問題なく動作しますが、CLI では「エラー C2275: 'エンティティ' : この型を式として不正に使用しています」というエラーがスローされます。

struct Property{
     char* label;
     PropertyTypes type;
     unsigned int member_offset;
     unsigned int position;
     unsigned char bit_offset;
};

struct Entity{
     ...
     bool transparent;
     ...
};

Property property = {"Transparent",     
       TYPE_BOOL,       
       offsetof(Entity, transparent), 
       0, 
       0}; // C2275 HERE

CLI には代替品がありますか?

4

4 に答える 4

4

私の推測では、コンパイラ メッセージは次のように要約されます。「offsetof」は既知のマクロではなく、それが関数である場合、そのパラメーターに型名を含めてはなりません。

編集:誰かがコメントで指摘したように、offsetofは実際には標準ライブラリの一部です。欠けているのはおそらく

#include <cstddef>

または、次のマクロの実装を使用できます (Win32/MFC ヘッダーから取得):

#ifdef _WIN64
    #define OFFSET_OF( s, m )\
      (size_t)((ptrdiff_t)&reinterpret_cast<const volatile char&>((((s*)0)->m)) )
#else
    #define OFFSET_OF( s, m )\
      (size_t)&reinterpret_cast<const volatile char&>((((s*)0)->m))
#endif
于 2009-03-26T10:48:13.503 に答える
1

標準 C++ には既に代替手段があります。&Entity::transparent. Propery クラスを再設計するときは、おそらくテンプレートを使用したいと思うでしょう。メンバーへのポインターの型は自明ではありません。

于 2009-03-26T10:46:48.640 に答える
0

暗闇の中でのショットで、これを再確認する機会はありません。

offsetof(Entity, transparent),

多分むしろ読む

 offsetof( struct Entity, transparent ),

???

于 2009-03-26T10:29:15.313 に答える
0

割り当てるオブジェクトのタイプを指定する必要があります。問題のメンバーにタイプの不一致があるようです。

使用例はこちらをご覧ください。

于 2009-03-25T21:17:44.840 に答える