我在GCC编译器上编译程序后感到很惊讶。它成功地运作了。编译器只给出警告。
warning: 'i' initialized and declared 'extern' [enabled by default] extern int i = 10; ^
我的代码:
#include <stdio.h>
//Compiler version gcc 4.9
extern int i = 10;
int main()
{
printf("%d\n",i);
return 0;
}
输出:
10
为什么不给编译错误?是不确定的行为?
答案 0 :(得分:-1)
您不应将主函数体放在标题中,而应放在.c文件中。反之亦然,您不应将extern
放在.c文件中,而只应放在标题中。这是声明和定义之间的区别。
Extern表示已知此变量,但没有为其保留内存。编译器现在说:好的,我知道你想要使用这个变量,但它只被允许在那里,而不是实际定义。
编译器无论如何都不知道可能定义此变量的其他对象(其他.c文件)。所以它让链接器继续实际尝试收集所有变量。
如果链接器现在没有在其他地方找到该变量,它会隐式地将变量设置为local,但会警告已破坏的C标准。