[英]C++ accessing variables from .CPP files
关于.cpp文件之间的变量访问如何工作,我有点模糊。 例如:
int main()
{
int a = i;
return 0;
}
int i;
这会在main.cpp上生成编译器错误,告诉我i中没有。 那么“静态”关键字在这种情况下有什么区别呢? (我尝试使用谷歌搜索,但大多数“静态关键字”信息页面谈论类和功能)
static int i;
它是一样的吗? 是否阻止extern int i
被用来访问i
在其他地方? 匿名命名空间的使用在如何处理变量方面有何不同?
namespace
{
int i;
}
总结一下:
在你的第一个例子中, main2.cpp
定义了一个全局变量i
,如果在该文件中出现了i
的extern
声明,那么main.cpp
可以访问它。 (通常,extern声明将来自头文件。)您遇到编译器错误,因为i
从未在main.cpp
声明过,这意味着编译器假定没有这样的变量。
在第二个示例中, main2.cpp
定义了一个文件范围变量i
。 文件范围变量与全局变量不同,即使它们碰巧具有相同的名称。 如果你曾经有过的外部声明i
在main.cpp
在第二个例子中,这两个文件将会成功编译 ,但你会得到,因为没有全局变量链接错误i
的定义。
如果你将main2.cpp
从第二个例子重命名为main2.cpp
, main3.cpp
一个extern声明的i
添加到main.cpp
,编译所有三个并将它们全部链接在一起,这将成功; main.cpp和main2.cpp将共享一个名为i
变量,而main3.cpp
将拥有自己的完全独立的变量,也称为i
。
这个东西叫做联系 。 命名空间几乎完全与链接无关。 但是,匿名命名空间是特殊的。 在匿名命名空间中定义变量用于所有实际目的与使用static
定义变量相同 - 它使其成为文件范围变量。 (如果我没记错的话,那就有区别,但只有你使用导出的模板做复杂的事情才有意义,并且由于导出的模板使用得很少,以至于他们正在谈论从C ++标准中删除该功能,所以你不要不得不担心它。)
匿名命名空间的值是你可以在其中放置一个类定义 ,这使得所有类的方法都是文件本地的。 (只有class { ... }
块必须在namespace { ... }
块内才能获得此效果。)您不能以任何其他方式执行此操作。
所有全局变量都有某种联系 。 extern
链接需要在不同文件之间的不同上下文中命名相同的变量。
extern
是默认值。 如果您在变量声明中实际使用extern
,则将其视为对另一个文件的引用。 省略任何链接说明符以实际创建变量; 这必须只在一个文件中发生。
extern int i; // i exists somewhere in some .cpp file.
int i; // ah! this is the file it exists in.
// (Although nothing special about that.)
应用于全局的static
(在命名空间范围内)使其成为文件的本地。 您从私有名称空间获得相同的效果,因此不推荐使用static
外部函数或类作用域。 许多人仍然使用它。
static
意义文件本地规则的例外是在类和inline
函数中。 由于语义相同,因此应该更恰当地将类static
成员称为extern
。 它很丑陋而令人困惑,但我猜Bjarne只想将extern
作为关键词消除。
内联函数可以在多个.cpp
文件中具有相同的定义,因此当创建static
变量时,也会共享变量定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.