为什么用EXTERN?
全局变量(外部变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。编译时将全局变量分配在静态存储区。有时需要用extern来声明全局变量,以扩展全局变量的作用域。如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern对该变量作外部变量声明,表示该变量是一个将在下面定义的全局变量。有了此声明,就可以从声明处起,合法地引用该全局变量,这种声明称为提前引用声明。extern关键字告诉编译器,"这个变量可能定义在这个模块或其它模块中",一个extern声明并没有生成数据,它仅表明这个数据是共享的。这个变量必须是在别处定义过的,而且它只能定义一次.

一个extern的小例子
view plaincopy to clipboardprint?
#include <iostream>  
  using namespace std;  
  int max(int,int);              //函数声明  
  void main( )  
  {extern int a,b;               //对全局变量a,b作提前引用声明  
  cout<<max(a,b)<<endl;  
  }  
  int a=15,b=-7;                  //定义全局变量a,b  
  int max(int x,int y)  
  {int z;  
  z=x>y?x:y;  
  return z;  
  }  
   
#include <iostream>
  using namespace std;
  int max(int,int);              //函数声明
  void main( )
  {extern int a,b;               //对全局变量a,b作提前引用声明
  cout<<max(a,b)<<endl;
  }
  int a=15,b=-7;                  //定义全局变量a,b
  int max(int x,int y)
  {int z;
  z=x>y?x:y;
  return z;
  }
  

运行结果如下:
15

在main后面定义了全局变量a,b,但由于全局变量定义的位置在函数main之后,因此如果没有程序的第5行,在main函数中是不能引用全局变量a和 b的。现在我们在main函数第2行用extern对a和b作了提前引用声明,表示a和b是将在后面定义的变量。这样在main函数中就可以合法地使用全局变量a和b了。如果不作extern声明,编译时会出错,系统认为a和b未经定义。一般都把全局变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern声明声明:在某个头文件1.h(可以在同一文件中或同一程序的不同文件中出现多次 );

2. 在多文件的程序中声明外部变量
如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量num,不能分别在两个文件中各自定义一个外部变量num。正确的做法是:在任一个文件中定义外部变量num,而在另一文件中用extern对num作外部变量声明。即
extern int num;

编译系统由此知道num是一个已在别处定义的外部变量,它先在本文件中找有无外部变量num,如果有,则将其作用域扩展到本行开始(如上节所述),如果本文件中无此外部变量,则在程序连接时从其他文件中找有无外部变量num,如果有,则把在另一文件中定义的外部变量num的作用域扩展到本文件,在本文件中可以合法地引用该外部变量num。分析下例:
file1.cpp file2.cpp
extern int a,b; int a=3,b=4;
int main( ) ┆
{cout<<a<<″,″<<b<<endl;
return 0;
}
用extern扩展全局变量的作用域,虽然能为程序设计带来方便,但应十分慎重,因为在执行一个文件中的函数时,可能会改变了该全局变量的值,从而会影响到另一文件中的函数执行结果。

另一个很好的例子
定义:在任何一个源文件x.cpp(只能定义一次!#include<1.h>) ;
使用:要使用这个全局变量,只要包含1.h就行了。
在全局域中定义的对象 如果没有指定显式的初始值 则该存储区被初始化为 0 因此下面两个定义中 var1和 var2有相同的初始值 0
int var1 = 0;
int var2;

关键字extern为声明但不定义一个对象提供了一种方法 实际上它类似于函数声明承诺了该对象会在其他地方被定义 或者在此文本文件中的其他地方 或者在程序的其他文本文件中 例如
extern int i;
对程序来说是一个 保证 表示在其他某个地方存在一个如下所示的定义
int i;
extern声明不会引起内存被分配 它可以在同一文件中或同一程序的不同文件中出现多次 典型情况下 全局对象的声明只在公共的头文件中出现一次
当一个程序文件需要引用这个全局对象时 它可以包含这个头文件
// 头文件
extern int obj1;
extern int obj2;
// 文本文件
int obj1 = 97;
int obj2;
既指定了关键字 extern 又指定了一个显式初始值的全局对象声明将被视为该对象的定义 编译器将会为其分配存储区 而且该对象后续的定义都被标记为错误 例如
extern const double pi = 3.1416; // 定义
const double pi; // 错误: 重复定义 pi

关键字 extern也可以在函数声明中指定 惟一的影响是将该声明的隐式属性 在其他地方定义 变为显式的 这样的声明有下列形式
extern void putValues( int*, int )
一般是在一个源文件如1.cpp里定义变量, 如 CString str;(这是定义,只能有一个定义)
在其他文件中要用使用时,可以在头文件如1.h里声明: extern CString str;(声明,可以有多处),然后include "1.h"就行了,不用再定义,否则定义重复,也可以不用声明;include "1.h"中已经声明。
例如:
---------------------
1.h 源码:
extern CString str;//这是声明,表示这个变量在其他文件里有定义,这里是1.cpp.一定要有个文件里有它的定义。
......
---------------------
1.cpp 源码:
include "1.h"
......
CString str; // 定义
......
---------------------

2.cpp 源码
include "1.h" // 声明了变量CString str,并且在 1.cpp里定义了
str = "......"; // 直接使用,include "1.h"中已经声明。
  ---------------------

.h文件 里若没有extern ,表示定义;
.cpp文件里有相同定义就是重复定义了;
.h文件里加了extern 后,表示声明,要有地方有它的定义(实现)。

c++之EXTERN详细讲解相关推荐

  1. stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)

    stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...

  2. 逐行隔行扫描的超详细讲解

    "Extern C"深入探索 DHCP及DHCP多作用域服务器工作原理 逐行隔行扫描的超详细讲解 2012-05-15 23:56:53|  分类: 分辨率 |  标签:逐行  隔 ...

  3. 适合新手练手,用Python爬取OPGG里英雄联盟英雄胜率及选取率,详细讲解加注释(建议收藏练手)

    今天来个简单的小项目,适合新手拿来练手,在OPGG上爬取英雄联盟里的法师,ADC,打野,辅助所有英雄的胜率及选取率,是不是感觉很高大上,但是却很简单,只要用三十多行代码就能实现,详细讲解每一行代码加注 ...

  4. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  5. Python的零基础超详细讲解(第十二天)-Python函数及使用

    基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...

  6. Python的零基础超详细讲解(第七天)-Python的数据的应用

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  7. Python的零基础超详细讲解(第五天)-Python的运算符

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  8. java异常详细讲解_Java异常处理机制的详细讲解和使用技巧

    一起学习 1. 异常机制 1.1 异常机制是指当程序出现错误后,程序如何处理.具体来说,异常机制提供了程序退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器. 1.2 ...

  9. 未来网络发展的趋势——IPv6详细讲解与基本配置

    实验目的: 1. 掌握IPv6的基本工作原理: 2. 区别IPv6和IPv4有什么区别: 3. 掌握IPv6的一些新的特征: 4. 掌握IPv6的发展进程和部署情况: 实验拓扑: 实验步骤:   一. ...

  10. Php中如何记录本报时间,详细讲解PHP的日期时间函数date()

    详细讲解PHP的日期时间函数date() 作者:wang 日期:2009-06-06 字体大小: 小 中 大 1,年-月-日 echo date('Y-m-j'); 2007-02-6 echo da ...

最新文章

  1. 【c语言】分解质因数
  2. XXL-CONF v1.4.1 发布,分布式配置管理平台
  3. 2009.09.01 博客近期改进公告!
  4. .NET中删除确认框的实现
  5. 秋风下的萧瑟 NOIP2018 游记
  6. 求方程式ax2 bx c=0的根c语言,关于求方程ax2+bx+c=0根的问题
  7. 虚拟机centos6.5 --安装jdk
  8. Alpha版本发布说明
  9. android markdown编辑器,安卓版好用的Markdown编辑器
  10. python基于Suprise模块构建推荐算法模型,实现电影、书籍等资源的推荐
  11. jcr多久更新一次_sci分区什么时候更新
  12. [Protues]protues8使用示波器制作李沙育图形
  13. 微信小程地图片未加载成功的情况 Failed to load local image resource
  14. 自媒体运营技巧之抖音快手怎么上热门
  15. Scratch快速入门(一)
  16. 聚会邀请html源码,聚会邀请短信
  17. 中国七大区域(东北,西北,华北,华南,华中,华东,西南) vue + Echrats地图效果
  18. moTzxx-CMS —— [一个基于PHP代码的后台管理系统(ThinkPHP5.1.40)]
  19. 漫说Android 中SurfaceView蕴含的美
  20. 傅里叶变换中,圆频率w与频率f之间的公式转化

热门文章

  1. SQLite: 关于日期的标准化问题
  2. linux ubuntu 安装 matlab 2010 及破解 详细图解
  3. 原创 | 职场二十年(一)电话风波
  4. linux access函数报错,详解汇编语言MOV指令
  5. ideal pom文件安装到maven库中_不装 maven 直接使用 IntelliJ 的插件来把本地 jar 包加入到 maven 仓库...
  6. anaconda python命令_怎么用anaconda命令行?
  7. @scheduled注解配置时间_《SpringBoot整合redis、Scheduled/quartz定时任务》
  8. 快二游戏数据分析_1.更快的数据分析
  9. pytorch torchvision的版本对应关系 pytorch历史版本
  10. jquery多维对象计算个数_山东省2005年专升本计算机考试真题2??