C++ 匿名命名空间

C++ 匿名命名空间,c++,namespaces,C++,Namespaces,这两者有什么不同 cpp文件: namespace { int var; } 或 如果两者都放在cpp文件中?我们在匿名名称空间中放置一个变量,使其仅对该文件是私有的,这是不对的?但是,如果我们在cpp文件中放入一个全局变量,那么该变量是否也具有特权,因为您从未对.cpp文件执行include操作?第二个版本是在全局命名空间中定义的--其他.cpp文件可以通过声明 extern-int-var 即使他们不这样做,如果其他人在全局名称空间中使用相同的名称,您也会得到一个链接错误(多定义符

这两者有什么不同

cpp文件:

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的人可以访问该变量
  • 如果在另一个文件中有另一个
    int-var
    全局变量,则该变量将有多个定义
  • 按照本标准的规定:

    […]在一个 翻译单元被替换为 相同的标识符和此标识符 与中的所有其他标识符不同 整个计划


    因此,我认为将变量设置为static.True可以得到相同的结果。也在C++中定义为const,这将意味着static .@ dACAV:True。但是C++的方式是使用匿名命名空间。使用静态仅仅是C++与C静态工作向后兼容的结果,但是由于它只适用于变量而被弃用。匿名名称空间可以包含其他内容,例如类定义。@Jon Reid:好的。然而,另一方面,如果您将一个类声明为
    .cpp
    文件,那么没有人会将它也声明到其命名空间中。相反,如果将匿名名称空间放入
    .h
    中,则在包含头文件时将无法操作其中的任何内容。声明类不会将符号添加到对象文件中,而变量和函数会这样做。
    extern int var;
    var = 42;