#line与全局静态范围的关系是什么?

tle*_*nes 3 c language-lawyer c-preprocessor

给定一个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;
}
Run Code Online (Sandbox Code Playgroud)

bar的两个声明是在相同的范围内还是单独的范围(即foo()会返回1)?

注意:我对基于标准的正确行为感兴趣,而不仅仅是"我的编译器做了什么"(因此语言 - 律师标记)

Jon*_*ler 5

#line信息不会更改翻译单元(TU).您的TU(源文件加上包含的文件)包含same(static)变量的两个定义.这是一个错误.编译器拒绝它.如何报告错误可能会受到#line指令的影响,但无论#line指令如何都会报告错误- 编译器正在尝试编译单个TU并且TU有问题.