我不太清楚 .cpp 文件之间的变量访问是如何工作的。例如:
main.cpp
int main()
{
int a = i;
return 0;
}
main2.cpp
int i;
这会在 main.cpp 上生成编译器错误,告诉我不存在 i 中。那么,“static”关键字在这种情况下有什么区别呢? (我尝试用谷歌搜索,但大多数“静态关键字”信息页面都在谈论类和函数)
main2.cpp
static int i;
是一样的吗?它会阻止 extern int i
被用来访问别处的 i
吗?匿名命名空间的使用在处理变量方面有何不同?
main2.cpp
namespace
{
int i;
}
总结:
- .cpp 文件之间可以访问变量吗? (除了 extern 关键字)
- 全局变量上的 static 关键字有何影响?
- 匿名命名空间如何影响事物?
最佳答案
在您的第一个示例中,main2.cpp
定义了一个全局变量 i
,本可以被 main.cpp 访问
如果 i
的 extern
声明出现在该文件中。 (通常 extern 声明来自头文件。)您遇到编译器错误,因为 i
从未在 main.cpp
中声明,这意味着编译器假定存在没有这样的变量。
在您的第二个示例中,main2.cpp
定义了一个文件范围 变量i
。文件作用域变量不同于全局变量,即使它们恰好具有相同的名称。如果您在第二个示例中的 main.cpp
中有一个 i
的外部声明,那么这两个文件都会成功编译,但是您会出现链接错误,因为未定义全局 变量i
。
如果您将第二个示例中的 main2.cpp
重命名为 main3.cpp
,则将 i
的外部声明添加到 main .cpp
,把这三个都编译出来,然后全部链接起来,就成功了; main.cpp 和 main2.cpp 将共享一个名为 i
的变量,而 main3.cpp
将拥有自己的完全独立 变量,该变量也名为 >我
。
这东西叫做链接。命名空间几乎与链接完全无关。然而,匿名命名空间是特殊的。在匿名命名空间中定义变量出于所有实际目的与使用static
定义它相同——它使它成为一个文件范围变量。 (如果我没记错的话,是有区别的,但只有当你用导出的模板做复杂的事情时才重要,而且导出的模板很少使用,他们正在谈论从 C++ 标准中删除这个特性,你不不必担心。)
匿名命名空间的值(value)在于您可以在其中放置一个类定义,这使得该类的所有方法都是文件本地的。 (只有 class { ... }
block 必须位于 namespace { ... }
block 内才能获得此效果。)您不能这样做方式。
关于C++ 从 .CPP 文件访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3662119/