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

C #线与全局静态范围的关系是什么?,c,c-preprocessor,language-lawyer,C,C Preprocessor,Language Lawyer,给定一个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) 注意:我对基于标准的正确行为感兴趣,而不仅仅是“我的编译器做什么”(因此是语言律师标签)行信息不会改变翻译单位(TU)。TU(源文件加上包含的文件)包含相同(

给定一个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)


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

行信息不会改变翻译单位(TU)。TU(源文件加上包含的文件)包含相同(
静态
)变量的两个定义。这是一个错误。编译器拒绝它。报告错误的方式可能会受到
#line
指令的影响,但无论
#line
指令如何,都会报告错误-编译器试图编译单个TU,而TU出现故障。

#line
是预处理器指令,它与变量范围无关。
#line
仅用于在诊断消息中显示原始源行号。它对程序的语义没有任何影响。编写时代码不会以任何方式编译。@Barmar
#line
也会修改
uu文件和
u line
。不,它不应该。范围基于翻译单位,而不是文件名。