对C/C++编程的人来说,关键字extern并不陌生,由extern修饰的变量或函数表明
这是一个会在别处(比如其他文件中)进行定义而在此处声明并在本文件中使用。
在绝大多数情况都没有问题,但是请看下面的例子:
文件1:firstfile.h
int var = 0;
文件2:secondfile.h
extern int var = 0;
我的本意是想在文件2中使用文件1定义的全局变量var,但实际上并没有达到这样的效果,
跟踪调试发现这个var的变化与我设想的根本不一致。后来查了一下《C++ Primer》发现在8.2
章中有这样一句: “既指定了关键字 extern 又指定了一个显式初始值的全局对象声明将被
视为该对象的定义 编译器将会为其分配存储区 而且该对象后续的定义都被标记为错误”。
至此真相大白,原来extern并不只是有声明的作用,也有定义。对于变量来说,如果在
extern“声明”的时候赋初值,那么就不再是声明,而是定义;对于函数,如果紧跟在后面有一对
空{},那么也同样是定义,编译器会把这些函数及变量当成新定义的来处理(会分配内存,而声明不会)。
secondfile.h中如果这样写:
extern int var; //这样就仅仅是声明需要用到firstfile中的var变量
所以,对exern而言,不能只看字面意思,这也算是一个小小的陷阱吧。