如果一个头文件被 #include 到一个以上的源文件里,这个头文件中所有的定义就会出现在每一个有关的源码文件里。这会使它们里的符号被定义一次以上,从而出现连接错误。解决办法就是不要在头文件里定义变量。你只需要在头文件里声明它们,然后在适当的源码文件(应该#include 那个头文件的那个)里定义它们一次。extern告诉编译器其所声明的符号的存在,并不会使编译器分配贮存空间。当做一个声明而不是做定义的时候,在声明前放一个关键字“extern”。
在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其他文件中可见。没有分配内存空间,声明的格式和定义的格式一定要严格相符。
1、用extern声明外部变量,扩展它在程序中的作用域
#include<iostream>
using namespace std;
void main(){
int f (int);
extern a; //外部变量声明
cout<f(a)<<endl;
}
int a=10; //定义外部变量
int f(int x){
cout<<"the number is "<<x<<endl;
}
2、 用extern将外部变量的作用域扩展到其他文件。
3、用extern声明外部函数