【C++】静态持续性、外部链接性、内部链接性如何理解

举报
王博Kings 发表于 2020/12/30 01:09:42 2020/12/30
【摘要】 目录 外部变量 单定义规则:  关键词extern 程序示例 运行结果: 全局变量和局部变量 外部变量 链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量在函数外部定义的,因此对所有函数而言都是外部的。外部变量也称全局变量(相对于局部的自动变量)。 单定义规则:  一方面,在每个使用外部变量的文件中,都必须声明它;另...

目录

外部变量

单定义规则: 

关键词extern

程序示例

运行结果:

全局变量和局部变量


外部变量

链接性为外部的变量通常简称为外部变量,它们的存储持续性为静态,作用域为整个文件。外部变量在函数外部定义的,因此对所有函数而言都是外部的。外部变量也称全局变量(相对于局部的自动变量)。

单定义规则: 

一方面,在每个使用外部变量的文件中,都必须声明它;另一方面,C++有“单定义规则”,该规则指出,变量只能有一次定义。为满足这种需求,C++提供两种变量声明。一种是定义声明(defining declaration)或简称为定义(definition),它给变量分配存储空间;另一种是引用声明(referencing declaration)或简称声明(declaration),他不给变量分配存储空间,因为它使用已有的变量。

关键词extern

引用声明使用关键词extern,且不进行初始化;否则,声明为定义,导致分配空间,如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(但定义规则),但在使用该变量的其他所有文件中,都必须使用关键字extern声明它:


  
  1. //file1.cpp
  2. extern int cats = 20; //definition because of initialization
  3. int dogs = 22; //also a definition
  4. int fieas; //also a definition
  5. //file2.cpp
  6. //use cats, dogs from file1.cpp
  7. extern int cats; //not definitions because they use
  8. extern int dogs; //extern and have no initialization
  9. //file99.cpp
  10. //use cats, dogs, and fieas from file1.cpp
  11. extern int cats;
  12. extern int dogs;
  13. extern int fieas;

其中file1.cpp中的cats因为存在赋值,因此该语句并非声明而是定义,extern可以忽略,同样定义了cats和dogs。file2.cpp中声明了cats和dogs,但没有重新声明fieas,因此无法访问它。

单定义规则并非意味着不能有多个变量的名称相同,例如,在不同函数中声明的同名自动变量是彼此独立的,它们都有自己的地址。

程序示例

external.cpp


  
  1. //external.cpp--全局变量,外部
  2. // 和support.cpp一起编译
  3. #include<iostream>
  4. using namespace std;
  5. // 外部变量
  6. double warming = 0.3;
  7. void update(double dt);
  8. void local();
  9. int main()
  10. {
  11. cout << "全局warming 是" << warming << "degrees.\n";
  12. update(0.1);
  13. cout << "全局warming 是" << warming << "degrees.\n";
  14. local();
  15. cout << "全局warming 是" << warming << "degrees.\n";
  16. return 0;
  17. }

support.cpp


  
  1. //support.cpp -- 使用外部变量
  2. //和external.cpp一起编译
  3. #include<iostream>
  4. extern double warming;//从其他文件中使用
  5. void update(double dt);
  6. void local();
  7. using std::cout;
  8. void update(double dt)
  9. {
  10. extern double warming;
  11. warming += dt;
  12. cout << "Updating global warming to" << warming << " degree.\n";
  13. }
  14. void local()
  15. {
  16. double warming = 0.8;
  17. cout << "Local warming = " << warming << "degree.\n";
  18. cout << "全局warming = " << ::warming;
  19. cout << " degree.\n";
  20. }

运行结果:

support.cpp中,声明了warming,由此我们可知使用的是external.cpp中的warming,因此update()修改了静态变量warming的值,另外update()中使用关键字extern重新声明了变量 warming,这个关键字的意思是,通过这个名称使用在外部定义的变量。由于即使省略该声明,update()的功能也相同,因此该声明是可选的。

loca()函数中定义了一个新的局部变量warming,局部变量隐藏全局变量。但C++比C语言更进一步——它提供了作用域解析运算符(::)。放在变量名前面时,该运算符表示使用变量的全局版本。
 

全局变量和局部变量

静态持续性、内部链接性:


  
  1. //file1.cpp
  2. int errors = 20;
  3. //file2.cpp
  4. static int errors = 5;
  5. void froobish() {
  6. cout << errors; //uses errors defined in file2
  7. }

 不同文件使用相同名称变量,一定要有static这样的表示局部,否则就违反了单定义规则!

9.2.4 

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/96315170

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。