这两者之间有什么不同?
CPP-文件:
namespace
{
int var;
}
或
int var;
如果两者都放在cpp文件中?我们在匿名命名空间中放置一个变量是不正确的,因此它可以仅用于该文件?但是,如果我们将一个全局变量放在一个cpp文件中,那个变量也不是私有的,因为你从来没有对.cpp文件进行包含吗?
答案 0 :(得分:29)
在第二种情况下,当您不使用匿名命名空间时,如果任何其他cpp文件声明extern int var;
,它将能够使用您的变量。
如果使用匿名命名空间,则在链接时,另一个cpp文件将生成未定义的引用错误。
答案 1 :(得分:4)
在第二种情况下,其他.cpp
个文件可以访问变量:
extern int var;
var = 42;
并且链接器会找到它。在第一种情况下,变量名称被破坏超出任何原因:)所以上述是不可能的。
答案 2 :(得分:3)
第二个版本在全局命名空间中定义 - 其他.cpp文件可以通过声明来获取
extern int var;
即使他们不这样做,如果其他人在全局名称空间中使用相同的名称,您将收到链接错误(乘以定义的符号)。
答案 3 :(得分:2)
除了Nikolai和其他人提供的理由之外,如果您不使用匿名命名空间,则可以获得与其他全局数据的命名冲突。如果使用匿名命名空间,则会改为遮蔽全局数据。
来自cprogramming.com:“在命名空间内,您可以确保没有全局名称会发生冲突,因为每个命名空间的函数名称优先于外部函数名称。”
答案 4 :(得分:1)
两点:
extern int var;
的任何人都可以访问您的变量,如果它不在未命名的命名空间中。int var
全局变量,则您将拥有此变量的多个定义。如标准中所述:
[...]所有出现的独特的一个 翻译单位被替换 相同的标识符和此标识符 与...中的所有其他标识符不同 整个计划。