#pragma once 不会阻止多个变量定义
Posted
技术标签:
【中文标题】#pragma once 不会阻止多个变量定义【英文标题】:#pragma once doesn't prevent multiple variable definitions 【发布时间】:2013-01-20 08:29:23 【问题描述】:我经常使用#pragma once
,它在处理标头时似乎工作正常,但由于某种原因,以下创建了多个定义的链接器错误:
#pragma once
int someVariable=5;
pragma
不应该也阻止这种情况吗?
【问题讨论】:
#pragma once 在标头中使用。不要在标题中定义变量!只需声明它。 #pragma once 只防止它被同一个文件多次包含,但不能被多次包含(例如,可以被两个不同的文件包含两次)。 它避免了header的内容被包含在同一个TU中而不是跨TU。您通过在标头中定义变量来破坏 ODR。 【参考方案1】:编译指示不应该也阻止这种情况吗?
不,在这种情况下,如果此头文件包含在多个位置,则会创建 someVariable 的多个定义。如果 B.h 和 C.h 都包含您的头文件,那么将创建两个 someVariable。
更好的方法是只在一个 .cpp 文件中定义变量,并在其他地方使用extern
。
【讨论】:
这有点误导;如果 B.h 和 C.h 在同一个翻译单元中,您仍然只会得到原始头文件的一份副本。问题是当 2 个 cop 文件包含它并且都将它包含在它们的目标文件中时。以上是关于#pragma once 不会阻止多个变量定义的主要内容,如果未能解决你的问题,请参考以下文章