给出一个C文件(foo.c)如下:
#line 1 "a.c"
static int bar = 1;
#line 2 "b.c"
static int bar = 2;
#line 2 "a.c"
int foo(){
return bar;
}
bar的两个声明是在相同的范围内还是在不同的范围内(即foo()会返回1)?
注意:我对基于标准的正确行为感兴趣,而不仅仅是"我的编译器做了什么" (因此是语言 - 律师标签)
答案 0 :(得分:5)
#line
信息不会更改翻译单位(TU)。您的TU(源文件加上包含的文件)包含相同(static
)变量的两个定义。这是一个错误。编译器拒绝它。报告错误的方式可能受#line
指令的影响,但无论#line
指令如何,都会报告错误 - 编译器正在尝试编译单个TU并且TU有问题。