【C++】静态持续性、外部链接性、内部链接性如何理解
目录
外部变量
链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量在函数外部定义的,因此对所有函数而言都是外部的。外部变量也称全局变量(相对于局部的自动变量)。
单定义规则:
一方面,在每个使用外部变量的文件中,都必须声明它;另一方面,C++有“单定义规则”,该规则指出,变量只能有一次定义。为满足这种需求,C++提供两种变量声明。一种是定义声明(defining declaration)或简称为定义(definition),它给变量分配存储空间;另一种是引用声明(referencing declaration)或简称声明(declaration),他不给变量分配存储空间,因为它使用已有的变量。
关键词extern
引用声明使用关键词extern,且不进行初始化;否则,声明为定义,导致分配空间,如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(但定义规则),但在使用该变量的其他所有文件中,都必须使用关键字extern声明它:
-
//file1.cpp
-
extern int cats = 20; //definition because of initialization
-
int dogs = 22; //also a definition
-
int fieas; //also a definition
-
-
//file2.cpp
-
//use cats, dogs from file1.cpp
-
extern int cats; //not definitions because they use
-
extern int dogs; //extern and have no initialization
-
-
-
//file99.cpp
-
//use cats, dogs, and fieas from file1.cpp
-
extern int cats;
-
extern int dogs;
-
extern int fieas;
其中file1.cpp中的cats因为存在赋值,因此该语句并非声明而是定义,extern可以忽略,同样定义了cats和dogs。file2.cpp中声明了cats和dogs,但没有重新声明fieas,因此无法访问它。
单定义规则并非意味着不能有多个变量的名称相同,例如,在不同函数中声明的同名自动变量是彼此独立的,它们都有自己的地址。
程序示例
external.cpp
-
//external.cpp--全局变量,外部
-
// 和support.cpp一起编译
-
#include<iostream>
-
using namespace std;
-
// 外部变量
-
double warming = 0.3;
-
-
void update(double dt);
-
void local();
-
-
int main()
-
{
-
cout << "全局warming 是" << warming << "degrees.\n";
-
update(0.1);
-
cout << "全局warming 是" << warming << "degrees.\n";
-
local();
-
cout << "全局warming 是" << warming << "degrees.\n";
-
return 0;
-
}
support.cpp
-
//support.cpp -- 使用外部变量
-
//和external.cpp一起编译
-
#include<iostream>
-
extern double warming;//从其他文件中使用
-
-
void update(double dt);
-
void local();
-
-
using std::cout;
-
void update(double dt)
-
{
-
extern double warming;
-
warming += dt;
-
cout << "Updating global warming to" << warming << " degree.\n";
-
}
-
-
void local()
-
{
-
double warming = 0.8;
-
cout << "Local warming = " << warming << "degree.\n";
-
cout << "全局warming = " << ::warming;
-
cout << " degree.\n";
-
}
运行结果:
support.cpp中,声明了warming,由此我们可知使用的是external.cpp中的warming,因此update()修改了静态变量warming的值,另外update()中使用关键字extern重新声明了变量 warming,这个关键字的意思是,通过这个名称使用在外部定义的变量。由于即使省略该声明,update()的功能也相同,因此该声明是可选的。
loca()函数中定义了一个新的局部变量warming,局部变量隐藏全局变量。但C++比C语言更进一步——它提供了作用域解析运算符(::)。放在变量名前面时,该运算符表示使用变量的全局版本。
全局变量和局部变量
静态持续性、内部链接性:
-
//file1.cpp
-
int errors = 20;
-
-
//file2.cpp
-
static int errors = 5;
-
void froobish() {
-
cout << errors; //uses errors defined in file2
-
}
不同文件使用相同名称变量,一定要有static这样的表示局部,否则就违反了单定义规则!
9.2.4
文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。
原文链接:kings.blog.csdn.net/article/details/96315170
- 点赞
- 收藏
- 关注作者
评论(0)