2009-03-25 16 views
2

C++/CLIではoffsetofマクロが機能していないようです。C++/CLIを使用したマクロのオフセット

アンマネージドC++では正常に動作しますが、「エラーC2275: 'エンティティ':この型の不正な式としての使用」がCLIで発生します。

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にはいくつかの代替品がありますか?

+0

いくつかのコードをしてください。 – dirkgently

答えて

4

"offsetof"は既知のマクロではなく、関数であればそのパラメータにはtypenameを含めてはいけません。

編集:誰かがコメントで指摘したように、 offsetofはが実際のSTDのlibの一部です。だから何不足しているのですが、あなたは(Win32の/ MFCのヘッダから取得した)このマクロの実装を使用することができ、またおそらくちょうど

#include <cstddef> 

です:

#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 
+0

はC++標準の一部です... – DevSolar

+0

...それは、実際にはそれを含むと仮定します... – DevSolar

+0

独自のマクロを定義すると、コンパイラが組み込み実装を使用できなくなる可能性があります。問題のないPOD(そして、標準では、offsetofはPODのために働くことを保証しています)。しかし、コンパイラの中には、非POD型を正しく扱うことができる組み込み関数があり、複数の継承や仮想継承を使用するクラスに対してもコンパイル時の定数式を与えるものがあります。そのようなことは、実行時にマクロ実装をクラッシュさせる傾向があります。 – Steve314

0

割り当てようとしているオブジェクトのタイプを指定する必要があります。問題のメンバーのためにタイプミスマッチがあるように見えます。

サンプルの使用方法については、thisを参照してください。

0

ただ、暗闇の中でショットして、これをダブルチェックするチャンスなし -

offsetof(Entity, transparent), 

は、おそらくかなり

offsetof(struct Entity, transparent), 

を読むべき?

+0

Spot on。彼の間違いはおそらく、構造体のtypedefを使っている大部分のコードから発生します。 – alecco

1

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

関連する問題