我正在 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)
这个问题似乎很熟悉——我之前尝试过解决但失败了,我想,但不久前。该代码在 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) };
};
显然,我可能可以使用一些条件编译来为此使用特定于编译器的函数,并且我相信 C++0x 将(最终)使其变得多余。但无论如何,我看不出这种使用offsetof
.
非常迂腐,有可能因为T
参数类型有时是非 POD,所以 GCC 类c_Test
为非 POD 并抱怨(并且抱怨和抱怨 - 我收到近 800 行这些警告)。
这对于标准的严格措辞来说是很顽皮的,因为非 POD 类型可能会破坏offsetof
. 但是,这种非 POD 在实践中应该不是问题 -c_Test
不会有虚拟表,也不需要运行时诡计来找到m_Test
.
此外,即使c_Test
有一个虚拟表,GCC 也使用一个内在函数来实现 offsetof 宏,该内在函数总是在编译时根据该特定类型的静态布局进行评估。提供一个工具,然后每次使用它时都会抱怨(抱歉,警告)似乎很愚蠢。
而且,我不是这里唯一一个做这种事情的人......
我确实记得offsetof
因为这种原因遇到过问题,但我认为问题不在于这个模板。
有任何想法吗?