C语言 关键字extern

来源:互联网 发布:java导出excel xlsx 编辑:程序博客网 时间:2024/04/30 04:09

假设有两段代码 分别在A.cpp和B.cpp中

//A.cppint i;int main(){    i = 100;}//B.cppint i;

由于A和B是分别编译,所以在编译阶段,没有问题。但是到了链接阶段:

Linking...B.obj:error LNK2005:"inti"(?i@@3HA)already defined in A.objDebug/A.exe:fatal error LNK1169:one or more multiply defined symbols foundError executing link.exe.A.exe-2 error(s),0 warning(s)

这是因为A和B文件中都定义了同名全局变量i,而在链接的时候一个程序的所有的非静态(static)全局变量要合并,所以就出现了冲突。

我们为上面的错误程序加上extern关键字:

//A.cppextern int i;int main(){    i = 100;}//B.cppint i;

编译链接成功!

这就是extern关键词的作用,extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”


extern定义和申明
这个关键字真的比较可恶,在定义(函数)的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说:
尤其是对于变量来说。

extern int a;//声明一个全局变量aint a; //定义一个全局变量aextern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。int a =0;//定义一个全局变量a,并给初值,

声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。

参考资料:http://baike.baidu.com/link?url=ZjJjKNcFWE2I8ciPU8SfgogztwQ6GV6KBkZTSO0Eov1RHx-G45PzxrN0Vnvrhv1K

0 0