【问题标题】:C++ Namespace questionC++ 命名空间问题
【发布时间】:2008-11-25 15:30:49
【问题描述】:

我正在编写一些由不再与公司合作的同事编写的代码,我发现了以下代码:(我在下面删减了)

namespace NsA { namespace NsB { namespace NsC {

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

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

我不明白第 3 行和第 8 行命名空间命令的用途。
有人能解释一下没有名称的命名空间条目的目的是什么吗?
谢谢

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

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

    这实际上意味着该命名空间内的所有项目都隐藏在该编译单元之外。它们只能在同一个文件中使用。另请参阅this article 上未命名的命名空间。

    【讨论】:

    • 有趣。我不知道你能做到这一点。我必须牢记这一点。
    • 它也忽略了static变量的需要(编译单元可见性)
    • static 偶尔还是有用的。它将使名称没有外部链接,而匿名命名空间将更改名称的链接。
    • 嗯,我认为未命名的命名空间强制内部链接,但只是查了一下,看起来你是对的。好想... :)
    • @GregRogers:是的,链接很重要,模板只能用外部链接的对象实例化(例如,尝试在函数内声明一个类并在矢量中使用它,不起作用,未命名的类命名空间外部函数:将工作...)
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2012-10-13
    • 2011-05-26
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多