我们如何在创建它的文件之外访问未命名的命名空间?

How can we access an unnamed namespace outside the file it is created in?

我正在网上阅读有关命名空间的内容,并阅读了有关未命名命名空间的内容。我读到未命名的名称空间只能在创建它们的文件中访问。但是当我自己尝试时,它并没有那样工作。这怎么可能?

这是我所做的:

文件 1:

#include <iostream>
using namespace std;

namespace space1 {
    int a = 10;
    void f() {
        cout << "in space1 of code 1" << endl;
    };
}

namespace {
    int x = 20;
    void f() {
        cout << "in unnamed space" << endl;
    }
}

file2:我从 file1

访问命名空间的地方
#include <iostream>
#include "code1.cpp"
using namespace std;

int main() {
    space1::f();
    cout << space1::a;
    cout << x << endl;
    f();

    return 0;
}

Can we access the unnamed namespaces outside the file they were created?

取决于您指的是哪个“文件”。如果您引用头文件,那么是的,您可以在外部访问未命名的命名空间,因为未命名的命名空间可用于包含头文件的整个翻译单元。

如果您引用整个翻译单元,则不可以,无法从其他翻译单元访问未命名的命名空间。

您读到未命名的命名空间仅限于创建它的 文件。那不是真的。它仅限于创建它的翻译单元

在预处理器阶段,您在 file2 中的 #include "code1.cpp" 语句将 code1.cpp 的所有代码带入 file2 的代码中。因此,当 file2 被编译时,两个代码都是同一个翻译单元的一部分,这就是 code1.cpp 中的未命名命名空间可被 file2 的代码访问的原因。