C中extern关键字的行为

时间:2017-02-27 17:57:04

标签: c extern

我在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

为什么不给编译错误?是不确定的行为?

1 个答案:

答案 0 :(得分:-1)

您不应将主函数体放在标题中,而应放在.c文件中。反之亦然,您不应将extern放在.c文件中,而只应放在标题中。这是声明和定义之间的区别。

Extern表示已知此变量,但没有为其保留内存。编译器现在说:好的,我知道你想要使用这个变量,但它只被允许在那里,而不是实际定义。

编译器无论如何都不知道可能定义此变量的其他对象(其他.c文件)。所以它让链接器继续实际尝试收集所有变量。

如果链接器现在没有在其他地方找到该变量,它会隐式地将变量设置为local,但会警告已破坏的C标准。