概述
extern 可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它文件中寻找其定义。extern 也可用来进行链接指定。
函数
extern定义函数
函数定义的前面如果加上extern,说明该函数可以在外部文件中使用。默认的应该就是extern,定义函数时如果没有指定是static,那么编译器会自动给函数添加extern关键字, 声明为外部可用。
extern声明函数
【Q】extern放在函数的前面成为
函数声明的一部分,作用是什么?
【A】extern int f(); 和int f();没有明显区别。
【Q】当函数提供方单方面修改函数原型时,如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会造成系统错误,这种情况应该如何解决?
【A】
通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方包含该头文件,从而省去extern这一步,以避免这种错误。
extern "C"
【Q】在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
【A】C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
变量
extern定义变量
int a; //
定义一个全局变量a
int a =0;//定义一个全局变量a,并给初值。
extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
extern声明变量
extern int a;//
声明一个全局变量a,声明之后不能直接使用这个变量,需要定义之后才能使用。
FAQ
【Q】在一个源文件中定义了一个数组:
char a[6]; 是否可以在另一个文件中通过声明
extern char *a; 来访问该数组?
【A】不可以,指向类型T的指针并不等价于类型T的数组。extern char *a; 声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为
extern char a[ ];