C++ 匿名命名空间
这两者有什么不同 cpp文件:C++ 匿名命名空间,c++,namespaces,C++,Namespaces,这两者有什么不同 cpp文件: namespace { int var; } 或 如果两者都放在cpp文件中?我们在匿名名称空间中放置一个变量,使其仅对该文件是私有的,这是不对的?但是,如果我们在cpp文件中放入一个全局变量,那么该变量是否也具有特权,因为您从未对.cpp文件执行include操作?第二个版本是在全局命名空间中定义的--其他.cpp文件可以通过声明 extern-int-var 即使他们不这样做,如果其他人在全局名称空间中使用相同的名称,您也会得到一个链接错误(多定义符
namespace
{
int var;
}
或
如果两者都放在cpp文件中?我们在匿名名称空间中放置一个变量,使其仅对该文件是私有的,这是不对的?但是,如果我们在cpp文件中放入一个全局变量,那么该变量是否也具有特权,因为您从未对.cpp文件执行include操作?第二个版本是在全局命名空间中定义的--其他.cpp文件可以通过声明
extern-int-var代码>
即使他们不这样做,如果其他人在全局名称空间中使用相同的名称,您也会得到一个链接错误(多定义符号)。在第二种情况下,其他.cpp
文件可以通过以下方式访问变量:
extern int var;
var = 42;
链接器会找到它。在第一种情况下,变量名的损坏超出了任何原因:),因此上述情况不可能发生。在第二种情况下,当您不使用匿名名称空间时,如果任何其他cpp文件声明了extern int var代码>,它将能够使用您的变量
如果使用匿名名称空间,则在链接时,另一个cpp文件将生成一个未定义的引用错误。除了Nikolai和其他人给出的原因外,如果不使用匿名名称空间,可能会与其他全局数据发生命名冲突。如果使用匿名名称空间,则会对全局数据进行阴影处理
From:“在名称空间内,您可以确保没有全局名称冲突,因为每个名称空间的函数名优先于外部函数名。”两点:
任何使用extern-int-var的人如果变量不在未命名的命名空间中,code>可以访问该变量
如果在另一个文件中有另一个int-var
全局变量,则该变量将有多个定义
按照本标准的规定:
[…]在一个
翻译单元被替换为
相同的标识符和此标识符
与中的所有其他标识符不同
整个计划
因此,我认为将变量设置为static.True可以得到相同的结果。也在C++中定义为const,这将意味着static .@ dACAV:True。但是C++的方式是使用匿名命名空间。使用静态仅仅是C++与C静态工作向后兼容的结果,但是由于它只适用于变量而被弃用。匿名名称空间可以包含其他内容,例如类定义。@Jon Reid:好的。然而,另一方面,如果您将一个类声明为.cpp
文件,那么没有人会将它也声明到其命名空间中。相反,如果将匿名名称空间放入.h
中,则在包含头文件时将无法操作其中的任何内容。声明类不会将符号添加到对象文件中,而变量和函数会这样做。
extern int var;
var = 42;