extern关键字的使用

A.置于变量或者函数前,以标示变量或者函数的定义在别处,提示编译器遇到此变量和函数时在其他地方寻找其定义。

B.可用来进行链接指定。

1.使用extern声明外部变量

1.1在一个文件内声明外部变量

  外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。编译时将外部变量分配在静态存储区。

  如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”。表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

 1 int max(int x,int y)
 2 {
 3     int z;
 4     z=x>y?x:y;
 5     return(z);
 6 }
 7 
 8 main()
 9 {
10     extern A,B;
11     printf("%d\n",max(A,B));
12 }
13 
14 int A=13,B=-8;

 

  说明:在本程序文件的最后1行定义了外部变量AB,但由于外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量AB。现在我们在main函数中用externAB进行“外部变量声明”,就可以从“声明”处起,合法地使用该外部变量AB

  extern声明外部变量时,类型名可以写也可以省写。例如,“extern int A,B;”也可以省写为“extern A,B;

1.2 在多文件的程序中声明外部变量

  如果程序由多个源程序文件组成,那么在一个文件中想引用另一个文件中已定义的外部变量,有什么办法呢?

  如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序的连接时会出现“重复定义”的错误。正确的做法是:在任一个文件中定义外部变量,而在另一文件中用externNum作“外部变量声明”。在编译和连接时,系统会由此知道Num是一个已在别处定义的外部变量,并将在另一个文件中定义的外部变量的作用域扩展到本文件,在本文件中可以合法地引用外部变量Num

1.3 具体使用方法

  在XXX.c中定义一个全局变量,在相应的XXX.h中使用extern对该变量进行声明。注意声明的时候不能进行初始化。如果其它文件中需要用到该全局变量,只需使用#include”XXX.h”包含头文件即可。

2.使用extern声明外部函数

(1) 在定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定:如果在定义函数时省略extern,则隐含为外部函数。

(2) 在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其它文件中定义的外部函数。

(3) 由于函数在本质上是外部的,在程序中经常要调用外部函数,为方便编程,C语言允许在声明函数时省写extern。由此可进一步理解函数原型的作用(不必使用extern),函数原型通知编译系统:该函数在本文件中稍后定义,或在另一文件中定义。

(4) 具体使用方法:在XXX.c中定义一个函数,在相应的XXX.h中使用extern对该函数进行声明。如果其它文件中需要用到该函数,只需使用#include”XXX.h”包含头文件即可。

3.使用extern进行链接指定

  在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?

  C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。

下面是一个标准的写法:

 1 //在.h文件开始声明函数原型的地方
 2 #ifdef __cplusplus
 3 #if __cplusplus
 4 extern "C"{
 5 #endif
 6 #endif /* __cplusplus */ 
 7 ...
 8 ...//函数原型
 9 ...
10 //.h文件函数原型结束的地方
11 #ifdef __cplusplus
12 #if __cplusplus
13 }
14 #endif
15 #endif /* __cplusplus */ 

 

 

转载于:https://www.cnblogs.com/Camilo/p/3765494.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值