匿名命名空间

时间:2010-07-29 14:42:43

标签: c++ namespaces

这两者之间有什么不同?

CPP-文件:

namespace
{
    int var;
}

int var;

如果两者都放在cpp文件中?我们在匿名命名空间中放置一个变量是不正确的,因此它可以仅用于该文件?但是,如果我们将一个全局变量放在一个cpp文件中,那个变量也不是私有的,因为你从来没有对.cpp文件进行包含吗?

5 个答案:

答案 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)

两点:

  1. 使用extern int var;的任何人都可以访问您的变量,如果它不在未命名的命名空间中。
  2. 如果在另一个文件中,您有另一个int var全局变量,则您将拥有此变量的多个定义。
  3. 如标准中所述:

      

    [...]所有出现的独特的一个   翻译单位被替换   相同的标识符和此标识符   与...中的所有其他标识符不同   整个计划。