【发布时间】:2020-01-21 16:00:07
【问题描述】:
1.h
extern int a;
1.c
#include <stdio.h>
#include "1.h"
int main(){
printf("%d\n", a);
return 0;
}
2.c
#include "1.h"
int a = 6;
如果您从1.h 中删除extern 并打印6,这将编译并运行得很好(gcc 1.c 2.c)。
我知道删除它可能会导致在每个翻译单元(目标文件)中定义a,但问题是什么?链接器不会在链接时将其删除,因为它编译时没有错误吗?
【问题讨论】:
-
如果您删除
extern,您在1.c中的a将未初始化,printf将调用未定义的行为。 -
但在链接过程中没有链接到正确的值?有没有关于这个的 gcc 规则?
-
实际上你应该在链接时遇到多个定义错误......除非我在这里遗漏了一些东西。
-
不,我没有收到任何错误。
-
嗯。也许没有错误,因为
2.c已完全优化。但是肯定有一个未定义的行为,因为当我尝试重现它时,它会为我打印0。