C++ cli 宏与C+的偏移量+/CLI
offsetof宏在C++/CLI下似乎不起作用 这在非托管C++中很好,但抛出“错误C2255:‘实体’:非法使用这个类型作为表达式:CLI.< /P>中的错误”C++ cli 宏与C+的偏移量+/CLI,c++-cli,C++ Cli,offsetof宏在C++/CLI下似乎不起作用 这在非托管C++中很好,但抛出“错误C2255:‘实体’:非法使用这个类型作为表达式:CLI.< /P>中的错误” struct Property{ char* label; PropertyTypes type; unsigned int member_offset; unsigned int position; unsigned char bit_offset; }; struct Enti
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是否有替换项?您需要提供要分配给的对象的类型。看起来有问题的成员的类型不匹配
请参阅示例用法。只是在黑暗中拍摄,没有机会再次检查-应该
offsetof(Entity, transparent),
也许我更喜欢读书
offsetof( struct Entity, transparent ),
??
< P>标准C++已经有替代方案了;代码>&实体::透明。在重新设计Property类时,可能需要使用模板。指向成员的指针的类型非常重要。我的猜测是,编译器消息可以归结为:“offsetof”不是一个已知的宏,如果它是一个函数,则其参数不能包含类型名 编辑:正如有人在评论中指出的,offsetof实际上是std库的一部分。所以缺少的可能只是#include <cstddef>
#包括
或者,您可以使用此宏实现(取自Win32/MFC头):
\ifdef\u WIN64
#定义(s,m)的偏移量\
(尺寸)(ptrdiff(t)和重新解释铸件(((s*)0)->m)))
#否则
#定义(s,m)的偏移量\
(尺寸t)和重新解释铸件(((s*)0)->m))
#恩迪夫
现场安装。他的错误可能源于大多数代码对结构进行了typedef。定义自己的宏可能会阻止编译器使用内部实现。对于POD来说,这并不重要(标准只保证offsetof对POD起作用)。但是有些编译器有一个可以正确处理非POD类型的内在函数,即使对于使用多重继承或虚拟继承的类,也会给出一个编译时常量表达式。这种事情往往会使宏实现在运行时崩溃。
#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