我们如何在创建它的文件之外访问未命名的命名空间?
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】:
我们可以在它们创建的文件之外访问未命名的命名空间吗?
取决于您指的是哪个“文件”。如果您引用头文件,那么是的,您可以在外部访问未命名的命名空间,因为未命名的命名空间可用于包含头文件的整个翻译单元。
如果您引用整个翻译单元,则否,则无法从其他翻译单元访问未命名的命名空间。
【讨论】:
@RetiredNinjathey are including the first cpp file
如果他们将一个文件包含到另一个文件中,那么包含的文件就是一个“标题”。不过,对头文件使用 .cpp 后缀是个坏主意。我不建议这样做。【参考方案2】:
您读到未命名的命名空间仅限于创建它的文件。那不是真的。它仅限于创建它的翻译单元。
在预处理阶段,file2
中的#include "code1.cpp"
语句将code1.cpp
的所有代码带入file2
的代码中。因此,当file2
被编译时,两个代码都是同一个翻译单元的一部分,这就是code1.cpp
中未命名的命名空间可以被file2
的代码访问的原因。
【讨论】:
以上是关于我们如何在创建它的文件之外访问未命名的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章