extern 关键字可以作用于变量和函数名前,表示此变量或函数已在此文件外定义。
1.为什么要有extern关键字?
因为运行大型程序时,为了将各逻辑模块分别写在不同文件,C++支持分离式编译。
例如,一个项目包括A.cpp、B.cpp、C.cpp 。
对A.cpp进行独立编译时(右键A.cpp有编译选项),不会对B.cpp和C.cpp进行编译,也就是说不会去编译这两个文件里的变量
和函数。如果在A.cpp中需要用到B.cpp或C.cpp里面定义的变量或函数,则需要在A.cpp中加extern关键字声明,告诉编译器,
这个变量在A.cpp之外的文件里面已经定义过了。如果A.cpp和B.cpp中对某一变量都有定义,若不将其中一个改为extern声明则调试时会出现重复定义的错误。
2.常见问题
(1)指向类型T的指针并不等价于类型T的数组:
举例解释: A.cpp中 int a[]={1,2,3,4};
若在B.cpp中需要用到上述定义的数组a,则 extern int a[];
这里需要注意几个问题:(1.1)不要再对extern声明的数组a赋值,否则将会抵消extern的作用,使a[]没有外部链
接性。
(1.2)不能写作 extern int *a;
虽然数组a的名称是一个地址,指针a也是一个地址,但数组a指向的地址存储着一块连 续的内存,内存大小为数组所占内存大小,而指针a指向的地址只存储着一块单一的地 址。所以指向类型T的指针并不等价于类型T的数组:
(2)extern只能作用于全局变量
在一个文件中的函数体内定义的变量,无法在其他文件中用extern声明后访问。即extern只能作用于具有外部链接属性的 变量或函数
(3)声明与定义的形式必须完全一致
如定义时 int fun(int a,int b) 则声明时,extern int fun(int a,int b);
{
return a+b;
}