【发布时间】:2011-03-08 23:29:39
【问题描述】:
我正在 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 宏,该内在函数总是在编译时根据该特定类型的静态布局进行评估。提供一个工具,然后每次使用它时都会抱怨(抱歉,警告)看起来很愚蠢。
而且,我不是这里唯一一个做这种事情的人......
Answer to legit-uses-of-offsetof question
我确实记得因为这种原因,offsetof 有问题,但我不认为问题出在这个模板上。
有什么想法吗?
【问题讨论】:
-
您能否为那些重现问题的 POD 类型添加一个示例?
-
@Georg - 没意义 - 我的想法不正确。他们有构造函数,因此不是 POD。请参阅下面的答案。