我认为externs是在编译单元之间共享变量。为什么以下代码有效?它是如何工作的?这是好习惯吗?
#include <stdio.h>
int x = 50;
int main(void){
int x = 10;
printf("Value of local x is %d\n", x);
{
extern int x;
printf("Value of global x is %d\n", x);
}
return 0;
}
打印出来:
Value of local x is 10
Value of global x is 50
答案 0 :(得分:4)
使用extern
关键字时,链接器会在对象文件/库/存档中找到具有匹配名称的符号。简单来说,符号是函数和全局变量(局部变量只是堆栈中的一些空间),因此链接器可以在这里做到这一点。
关于它是一种好的做法 - 一般来说,全球变量不被认为是一种好的做法,因为它们会导致意大利面条代码并且污染&#39;符号池。
答案 1 :(得分:0)
除answer的Jonathan Leffler外,请同时查看同一问题on gcc.gnu.org mailing list的答案。
这两个答案都是以相同的精神,使用ISO / IEC 9899的措辞。