嵌套的匿名命名空间?

时间:2010-01-19 14:20:00

标签: c++ namespaces

当使用匿名命名空间时,如果它嵌套在另一个命名空间中会有任何问题吗?例如,在以下代码中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();
    }
}

2 个答案:

答案 0 :(得分:30)

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

  

unnamed-namespace-definition的行为就像它被

替换一样
  namespace unique { /* empty body */ }
  using namespace unique;
  namespace unique { namespace-body }
     

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

没有其他问题。

答案 1 :(得分:3)

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

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