extern的困惑


摘自:http://blog.csdn.net/fxjtoday/article/details/6021845

  如果想明白为什么需要extern, 需要从编译和链接讨论起,

  现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说, 因此,各个文件中定义的全局变量名不可相同。



 i;

  所以上面两个文件编译是没有问题的, 但是到了链接就会报重名错误

  如果此时A.cpp里面要用到, B.cpp中定义的i, 应该怎么办?

  那么既然上面说了重复定义出错, 那就把A.cpp中的"int i;"定义直接去掉是否可以

  看起来好像可以的, 因为全局变量的作用域是整个源程序, 这边也许是很多人会产生疑问的地方, 既然全局变量和全局函数的作用域是整个源程序的, 为什么在其他的文件里面使用一定要先声明(, 记住include就是copy, 之所以要使用.h, 而不是直接写在.c中, 只是为了保证易维护性, 最终编译器会自动将.h copy到每个.c中)

  答案就在编译阶段,

  多说一句, 在声明变量是必须要加extern, 而在声明函数时却不需要, 为什么

  上面说了, , 必须要正确区分

  而函数不需要extern也能区分处定义和声明, 有实现就是定义, 没有就是声明, 所以不需要再加extern

  这就是c的简洁之处, 不需要的就别写

  再多说一句, 如果想变成仅当前文件可见, 必须加上static.

  所以对于extern有如下说法,

  用于函数定义, 表示全局可见(属于冗余的)

相关内容