extern本意是表示函数或者变量在别处定义。
被extern修饰的全局变量不被分配空间,而是在连接的时候到别的文件中通过查找索引定位该全局变量的地址。
变量默认是stastic内部链接,函数默认是外部链接extern, 若函数定义在调用之前,可以通过;但是如果函数定义在调用之后的话就的加extern来声明,不然会警告调用没有原型。
1.用extern来声明全局变量
1)如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终,表示该变量是一个将在下面定义的全局变量
#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;
}
2)在多文件的程序中声明外部变量 ,在任一个文件中定义外部变量,而在另一文件中用extern对外部变量声明。
编译系统由此知道是一个已在别处定义的外部变量,它先在本文件中找有无外部变量,如果有,则将其作用域扩展到本行开始,如果本文件中无此外部变量,则在程序连接时从其他文件中找有无外部变量,如果有,则把在另一文件中定义的外部变量的作用域扩展到本文件
2.用extern声明外部函数
(1) 定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用。如果在定义函数时省略extern,则隐含为外部函数。//所以说其实定义处是不用写extern的,但也有人声明和定义都写上
(2) 在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数。//这个才是关键,必须写一下声明