【问题标题】:Nested unnamed namespace?嵌套未命名的命名空间?
【发布时间】:2011-01-06 20:02:55
【问题描述】:

当使用未命名的命名空间时,如果它嵌套在另一个命名空间中,会有什么问题吗?例如,以下代码中 Foo1.cpp 和 Foo2.cpp 之间是否有任何真正的区别:

// Foo.h
namespace Foo
{
    void fooFunc();
}

// Foo1.cpp
namespace Foo
{
    namespace
    {
        void privateFunction()
        {
            ...
        }
    }

    void fooFunc()
    {
        privateFunction();
    }
}

// Foo2.cpp
namespace
{
    void privateFunction()
    {
        ...
    }
}

namespace Foo
{
    void fooFunc()
    {
        privateFunction();
    }
}

【问题讨论】:

  • 导出的符号会有所不同。看看 nm 输出。
  • 只是为了迂腐,技术术语是unnamed namespace,不是匿名的。
  • 联合是匿名的,命名空间是未命名的。但谁在乎:)
  • 虽然这个词是unnamed,但如果你在工具下用nmgdb查看会叫它anonymous namespace,所以混淆是可以理解的。

标签: c++ namespaces unnamed-namespace


【解决方案1】:

未命名的命名空间可以被视为具有您不知道的唯一名称的普通命名空间。根据 C++ 标准 7.3.1.1:

一个未命名的命名空间定义的行为就像它被替换了一样

  namespace unique { /* empty body */ }
  using namespace unique;
  namespace unique { namespace-body }

翻译单元中所有出现的唯一性都被相同的标识符替换,并且该标识符不同于整个程序中的所有其他标识符。

没有其他问题。

【讨论】:

    【解决方案2】:

    对于您的目的而言,可能没有真正的区别。它会影响您的 cpp 文件中 privateFunction 的可见位置。如果将void barFunc() { privateFunction(); } 添加到两个文件的末尾,则 Foo2.cpp 会编译,而 Foo1.cpp 不会。

    通常您不会在同一个 cpp 文件中定义来自许多不同名称空间的外部符号,因此不会出现差异。

    【讨论】:

    • “两个文件的结尾”意思是“在namespace Foo {}之后”?
    • @MikeC - 是的,我会说@SteveJessop 的意思是在namespace Foo {}之后
    猜你喜欢
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2015-01-08
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2011-03-13
    相关资源
    最近更新 更多