Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌套的未命名命名空间?_C++_Namespaces_Unnamed Namespace - Fatal编程技术网

C++ 嵌套的未命名命名空间?

C++ 嵌套的未命名命名空间?,c++,namespaces,unnamed-namespace,C++,Namespaces,Unnamed Namespace,使用未命名的命名空间时,如果它嵌套在另一个命名空间中,是否存在任何问题?例如,Foo1.cpp和Foo2.cpp在以下代码中是否存在任何实际差异: // Foo.h namespace Foo { void fooFunc(); } // Foo1.cpp namespace Foo { namespace { void privateFunction() { ... } } vo

使用未命名的命名空间时,如果它嵌套在另一个命名空间中,是否存在任何问题?例如,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();
    }
}

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

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

翻译单元中出现的所有唯一标识符均替换为同一标识符,且该标识符不同于整个程序中的所有其他标识符


没有其他问题。

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


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

导出的符号将不同。看一看nm输出。只是为了学究,技术术语是
未命名命名空间
,而不是匿名。联合是匿名的,命名空间是未命名的。但是谁在乎呢:)虽然这个术语是
未命名的
,但是如果你在工具下用
nm
gdb
检查,它将被称为
匿名名称空间
,所以混淆是可以理解的。“两个文件的结尾都是
名称空间Foo{}
之后的“意思”?@MikeC-是的,我想说@SteveJessop的意思是在
名称空间Foo{}
  namespace unique { /* empty body */ }
  using namespace unique;
  namespace unique { namespace-body }