#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 不会阻止多个变量定义的主要内容,如果未能解决你的问题,请参考以下文章

#pragma once 与包含守卫? [复制]

pragma once与#ifndef的作用有什么区别

#pragma once含义及用法

#pragma once 与 #ifndef

#pragma once vs. include guards [重复]

#pragma once