35

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

2 回答 2

33

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

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

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

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

没有其他问题。

于 2010-01-19T14:43:46.443 回答
4

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

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

于 2010-01-19T14:44:36.740 回答