C++ cli 宏与C+的偏移量+/CLI

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

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 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