未命名的命名空间对全局变量有什么影响?

问题描述 投票:0回答:5

这两个源文件有什么区别?

namespace { int var; }
// or
int var;

如果两者都放在 cpp 文件中,我们将变量放在未命名的命名空间中以便它可以仅对该文件是私有的,这是不正确的吗?但是,如果我们将全局变量放入 cpp 文件中,该变量不是也是私有的吗,因为您从不包含 .cpp 文件?

c++ global-variables linkage unnamed-namespace
5个回答
32
投票

在第二种情况下,当您不使用匿名名称空间时,如果任何其他 cpp 文件声明

extern int var;
,它将能够使用您的变量。

如果使用匿名命名空间,那么在链接时,另一个cpp文件将生成未定义的引用错误。


4
投票

在第二种情况下,其他

.cpp
文件可以访问该变量:

extern int var;
var = 42;

链接器会找到它。在第一种情况下,变量名称因任何原因而被破坏:),因此上述情况是不可能的。


3
投票

第二个版本是在全局命名空间中定义的——其他 .cpp 文件可以通过声明来获取它

extern int var;

即使他们不这样做,如果其他人在全局名称空间中使用相同的名称,您也会收到链接错误(多重定义的符号)。


2
投票

除了 Nikolai 等人给出的原因之外,如果不使用匿名命名空间,则可能会与其他全局数据发生命名冲突。如果您确实使用匿名命名空间,则会隐藏全局数据。

来自 cprogramming.com:“在命名空间内,您可以放心,不会发生全局名称冲突,因为每个命名空间的函数名称优先于外部函数名称。”


1
投票

两点:

  1. 任何使用
    extern int var;
    的人都可以访问您的变量(如果它不在未命名的命名空间中)。
  2. 如果在另一个文件中,你有另一个
    int var
    全局变量,你将有这个变量的多个定义。

按照标准规定:

[...] 中唯一出现的所有情况 翻译单元被替换为 相同的标识符和这个标识符 与所有其他标识符不同 整个程序。

© www.soinside.com 2019 - 2024. All rights reserved.