代码之家  ›  专栏  ›  技术社区  ›  Rob

嵌套匿名命名空间?

  •  30
  • Rob  · 技术社区  · 15 年前

    使用匿名命名空间时,如果它嵌套在另一个命名空间中,是否存在任何问题?例如,在以下代码中,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 回复  |  直到 12 年前
        1
  •  29
  •   WilliamKF    12 年前

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

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

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

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

    没有其他问题。

        2
  •  3
  •   Steve Jessop    15 年前

    可能对你的目的没有真正的区别。这对cpp文件中的位置有影响 privateFunction 是可见的。如果添加 void barFunc() { privateFunction(); } 在这两个文件的末尾,然后foo2.cpp编译,而foo1.cpp不编译。

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