【问题标题】:#pragma once doesn't prevent multiple variable definitions#pragma once 不会阻止多个变量定义
【发布时间】:2013-01-20 08:29:23
【问题描述】:

我经常使用#pragma once,它在处理标头时似乎工作正常,但由于某种原因,以下创建了多个定义的链接器错误:

#pragma once
int someVariable=5;

pragma 不应该也阻止这种情况吗?

【问题讨论】:

  • #pragma once 在标头中使用。不要在标题中定义变量!只需声明它。 #pragma once 只防止它被同一个文件多次包含,但不能被多次包含(例如,可以被两个不同的文件包含两次)。
  • 它避免了header的内容被包含在同一个TU中而不是跨TU。您通过在标头中定义变量来破坏 ODR。

标签: c++


【解决方案1】:

编译指示不应该也阻止这种情况吗?

不,在这种情况下,如果此头文件包含在多个位置,则会创建 someVariable 的多个定义。如果 B.h 和 C.h 都包含您的头文件,那么将创建两个 someVariable。

更好的方法是只在一个 .cpp 文件中定义变量,并在其他地方使用extern

【讨论】:

  • 这有点误导;如果 B.h 和 C.h 在同一个翻译单元中,您仍然只会得到原始头文件的一份副本。问题是当 2 个 cop 文件包含它并且都将它包含在它们的目标文件中时。
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多