2010-07-29 150 views
23

这两者有什么不同?匿名命名空间

CPP文件:

namespace 
{ 
    int var; 
} 

int var; 

如果两者都放在cpp文件?我们在匿名命名空间中放置一个变量是不正确的,因此它对于该文件可以是私有的?但是,如果我们把一个全局变量放在一个cpp文件中,那么这个变量是不是也是privat,因为你永远不会为.cpp文件做一个include?

回答

29

在第二种情况下,当您不使用匿名命名空间时,如果任何其他cpp文件声明extern int var;,它将能够使用您的变量。

如果您使用匿名命名空间,则在链接时,其他cpp文件将生成未定义的引用错误。

+2

所以我认为你可以通过将变量设置为静态来获得相同的结果。 – Dacav 2010-07-29 15:47:42

+0

是的。另外在C++中将其定义为const,这将暗示静态。 – 2010-07-29 16:01:30

+1

@Dacav:是的。但C++的做法是使用匿名命名空间。使用静态只是C++与C向后兼容的结果。 – 2010-07-29 17:20:07

3

第二个版本在全局命名空间中定义 - 其他.cpp文件,可以得到它通过声明

extern int var;

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

4

在第二种情况下,其他.cpp文件可以访问该变量为:

extern int var; 
var = 42; 

和链接器会发现它。在第一种情况下,变量名称被超出任何理由地修改:)所以以上是不可能的。

2

除了Nikolai和其他人提供的理由之外,如果您不使用匿名命名空间,则可能会与其他全局数据产生命名冲突。如果您确实使用匿名名称空间,则将影响全局数据。

cprogramming.com:“在命名空间中,您确信没有全局名称会冲突,因为每个名称空间的函数名称优先于外部函数名称。”

1

两点:

  1. 使用extern int var;可以访问您的变量,如果它不是在具名命名空间的人。
  2. 如果在另一个文件中,您有另一个int var全局变量,您将有多个此变量的定义。

如在标准中规定:

[...]在一个 翻译单元的独特所有出现由 相同的标识符替换和该标识符 从 所有其他标识符不同整个程序。