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

Posted

技术标签:

【中文标题】我们如何在创建它的文件之外访问未命名的命名空间?【英文标题】:How can we access an unnamed namespace outside the file it is created in? 【发布时间】:2022-01-14 21:01:21 【问题描述】:

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

这是我所做的:

文件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;

【问题讨论】:

#include "code1.cpp" 使其成为同一个文件。 【参考方案1】:

我们可以在它们创建的文件之外访问未命名的命名空间吗?

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

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

【讨论】:

@RetiredNinja they are including the first cpp file 如果他们将一个文件包含到另一个文件中,那么包含的文件就是一个“标题”。不过,对头文件使用 .cpp 后缀是个坏主意。我不建议这样做。【参考方案2】:

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

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

【讨论】:

以上是关于我们如何在创建它的文件之外访问未命名的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

使用命名空间之外的 T4 模板位置

如何仅将“未命名:”列重命名为数字索引

如何防止从命名空间内访问类?

未命名的命名空间访问规则

如何从另一个命名空间而不是全局命名空间定义函数和数据?

如何减轻类声明远离文件中的所有者命名空间声明?