C++ 命名空间问题

17

我正在处理一些由已经不在公司的同事编写的代码,发现了以下代码(已经在下面进行了精简):

namespace NsA { namespace NsB { namespace NsC {

    namespace { 
        class A { /*etc*/ };
        class B { /*etc*/ };
    }    

    namespace {
        class C { /*etc*/ };
    }
} } }

我不理解第3行和第8行的名称空间命令的目的。
有人能解释一下没有名称的名称空间条目的目的吗?
谢谢

1个回答

36

这是一个“匿名命名空间” - 它创建了一个隐藏的命名空间名称,保证每个“翻译单元”(即每个CPP文件)都是唯一的。

这实际上意味着该命名空间内的所有项都对编译单元外部隐藏。它们只能在同一个文件中使用。请参见此文章有关未命名命名空间的内容。


有趣。我不知道你可以这样做。我需要记住这个。 - Herms
它还使得static变量(编译单元可见性)不再需要。 - xtofl
1
static 有时仍然很有用。它将使名称没有 extern 链接,而匿名命名空间将更改名称的链接。 - Johannes Schaub - litb
嗯,我以为未命名的命名空间会强制内部链接,但是查了一下,看起来你是对的。多么奇妙啊... :) - jalf
2
@GregRogers:是的,链接很重要,模板只能用于具有外部链接的对象实例化(例如在函数内声明类并在vector<>中使用它将不起作用,而在函数外未命名命名空间中的类则可以使用...) - Pieter
谢谢你上次的补充,Pieter - 这是我从未考虑过的。好信息! - Joris Timmermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接