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 :(得分: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 ),
???