基础语法 - extern关键词

说明

  • extern的英文意思是“外部”。

何为外部?

  • C/C++程序编译时,编译器并不是将所有源码一起编译,而是以单个源码文件为单元逐一编译,编译单个源码文件时其它源码文件是不可见,其它源码定义的函数和全局变量也是不可见的,是正在编译源码的外部定义。
  • 链接时才将所源码中有定义和使用链接到一起。

作用

  • 使用extern声明外部定义,以避免编译单个源码时找不到全局变量或函数的声明,误判为代码错误。

特点

  1. 由于链接时,才将定义和使用链接到一起,因此如果声明外部变量时变量名写错,编译时不会报错,而是在链接时报错。
* 文件名:a.c
int a;

* 文件名:b.c
extern int a1;

* 编译: undefined reference to `a1'
  1. 声明外部变量,类似于在本源码文件重新声明一个占位变量,链接时再做替换,两个声明可以完全不一致,但是实际变量只有一个,编译源码是严格按照声明进行处理的,因此可能造成外部声明和实际变量限制不匹配,如下:
1. 外部声明限制少于实际声明
* 文件名:a.c 
extern int a,b;

b = 1;

* 文件名:b.c
static int a; 
const int b;

* 编译:
undefined reference to `a' //原因:b.c中的变量a声明有static
* 运行:(修正编译错误)
Segmentation fault (core dumped) //原因:b.c中的变量b是const。 

2. 外部声明限制多于实际声明
* 文件名:a.c 
extern const int *a;

*a = 1;

* 文件名:b.c
int a; 

* 编译
编译a.c,"*a = 1"时会提示错误,不能修改只读变量

3. 总结
* extern 不会获取实际声明,类似重新声明,为了避免产品错误,外部声明应该和实际声明完全一致。

用途

  1. 声明外部全局变量
  • 如果需要使用别的源码中声明的全局变量,使用extern进行声明。
  1. 暗示函数定义可能在别的源文件
  • 如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,也可以就在当前文件中定义,不加也无影响,因为函数链接默认就是按多文件处理的,只需要有函数声明。
  1. 声明函数调用规范
  • 在C/C++混合开发中,为了实现兼容,extern可用于指示C或者C++函数的调用规范,例如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数;这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接;主要原因是C++和C程序编译完成后在目标代码中命名规则不同。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值