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;
如果从extern
中删除1.h
并打印6
,则此命令可以编译并正常运行(gcc 1.c 2.c)。我知道删除它可能会导致在每个翻译单元(目标文件)中定义a
,但是这是什么问题呢?链接程序编译时没有错误,链接程序不是只是摆脱了链接吗?
此技术不符合C标准的字母和“一个定义规则”-这是正式未定义的行为: