【问题标题】:What is wrong with this use of offsetof?使用 offsetof 有什么问题?
【发布时间】: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。请参阅下面的答案。

标签: c++ gcc gcc4


【解决方案1】:

哎呀...

问题 ,由于 T 类型为非 POD,c_Test 结构为非 POD。这是来自 GCC 手册的引述...

-Wno-invalid-offsetof(仅限 C++ 和 Objective-C++)

禁止应用 'offsetof' 宏到非 POD 类型。

根据 1998 ISO C++ 标准,将“offsetof”应用于 非 POD 类型未定义。在现有 然而,C++ 实现, “offsetof”通常给出有意义的 即使应用于某些结果 各种非 POD 类型。 (比如一个 不能成为 POD 的简单“结构” 仅凭借具有 构造函数。)这个标志是给用户的 谁知道他们正在写作 不可移植的代码和谁有 故意选择忽略 警告它。

对‘offsetof’的限制可能是 在 C++ 的未来版本中放宽 标准。

我的问题是我几乎所有的 T 类型都有构造函数,因此被归类为非 POD。我之前忽略了这一点,因为它无关紧要——当然,原则上它应该与 offsetof 无关。问题是 C++ 标准使用一种 POD 与非 POD 分类,即使有许多不同的方式可以成为非 POD,并且编译器默认警告不符合标准的使用是正确的。

我目前的解决方案是上面的选项来抑制警告 - 现在我只需要弄清楚如何告诉 cmake 使用它。

【讨论】:

  • 我接受这个感到内疚 - 也许我应该撤消那个并删除这个问题?
  • 很好,因为它确实回答了您的问题 - 其他人可能会犯同样的错误。甚至还有一个badge 鼓励这样做:)
  • cmake 解决方案:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-invalid-offsetof")
猜你喜欢
  • 2010-10-17
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2018-10-13
  • 2011-04-24
  • 2010-10-21
相关资源
最近更新 更多