使用C ++ / CLI偏移宏

时间:2009-03-25 21:03:14

标签: 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有替换吗?

4 个答案:

答案 0 :(得分:4)

我的猜测是编译器消息归结为:“offsetof”不是已知的宏,如果它是一个函数,则其参数不能包含类型名。

编辑:正如有人在评论中指出的那样, offsetof 实际上是std lib的一部分。所以缺少的可能只是

#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

答案 1 :(得分:1)

标准C ++已经有了另一种选择; &Entity::transparent。在重新设计Propery类时,您可能希望使用模板。指向成员的指针的类型是非常重要的。

答案 2 :(得分:0)

您需要提供要分配的对象的类型。看起来有问题的成员存在某种类型不匹配。

请参阅this了解样本用法。

答案 3 :(得分:0)

只是在黑暗中拍摄,没有机会仔细检查 - 应该

offsetof(Entity, transparent),
或许更愿意阅读

 offsetof( struct Entity, transparent ),

???