extern关键字的作用是声明变量和函数为外部链接,
即该变量或函数名在其它文件中可见。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义。
例如语句:extern int a;
仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
如果一个工程包含如下两个文件:
1.cpp如下: 2.cpp如下:
int x,y; extern int x,y;
extern void PrintHello(); void PrintHello()
void Func1() {
{ cout<<"hello!"<<endl;
x=123; }
} void Func2()
int main() {
{ y=x*10;
PrintHello(); }
.
.
....
}
在2.cpp中使用extern int x,y;只是声明了x,y这两个变量,它告诉编译器其后的变量已经在别的文件中说明,不再为它们分配内存。当两个文件都编译成为.obj后(事实上在编译项目的时候,所有文件都会被编译,所以所有函数都会找到),连接时所有的外部变量和函数都得到统一,可以共享各自定义的全局变量和函数。