我正在编译MinGW GCC 4.4.0中的一些c ++代码,并使用以下表单获取警告......
warning: invalid access to non-static data member '<membername>' of NULL object
warning: (perhaps the 'offsetof' macro was used incorrectly)
Run Code Online (Sandbox Code Playgroud)
这个问题似乎很熟悉 - 我想,之前我曾试图解决这个问题,但我想,但不久之前.代码在Visual C++中构建得很好,但我最近没有在任何其他编译器中构建这个特定的代码.
问题代码是以下模板......
template<typename T>
class c_Align_Of
{
private:
struct c_Test
{
char m_Char;
T m_Test;
};
public:
enum { e_Align = offsetof (c_Test, m_Test) };
};
Run Code Online (Sandbox Code Playgroud)
显然,我可以使用一些条件编译来为此使用特定于编译器的函数,我相信C++ 0x(最后)会使它变得多余.但无论如何,我看不出这种用法有什么不妥offsetof.
非常迂腐,有可能因为T参数类型有时是非POD,所以GCC类c_Test作为非POD和抱怨(抱怨和抱怨 - 我得到近800行这些警告).
由于非POD类型可能会破坏,因此标准的严格措辞令人顽皮offsetof.但是,这种非POD在实践中应该不是问题 - c_Test不会有虚拟表,也不需要运行时技巧来查找偏移量m_Test.
此外,即使c_Test有一个虚拟表,GCC 也会使用内部函数实现offsetof宏,该内部函数总是在编译时根据该特定类型的静态布局进行求值.提供一个工具,然后每次使用时抱怨(抱歉,警告)似乎很愚蠢.
另外,我不是这里唯一一个做这种事的人......
我确实 …
C++中__builtin_offsetof运算符(或Symbian中的_FOFF运算符)的用途是什么?
它还有什么回报?指针?字节数?