#line是什么意思

What does #line mean?

本文关键字:意思 是什么 #line      更新时间:2023-10-16

下一行做什么?

#line 25 "CSSGrammar.y"

那分机是怎么回事?

根据标准:

§16.4.3:

表单的预处理指令

# line digit-sequence new-line

使实现表现为以下源代码行序列以源代码行开头具有由数字序列指定的行号(解释为十进制整数)。如果数字序列指定零或大于2147483647的数字,则行为未定义。

§16.4.4:

表单的预处理指令

# line digit-sequence " s-char-sequenceopt" new-line

类似地设置假定行号,并将源文件的假定名称更改为内容字符串文字的。

§16.4.5:

表单的预处理指令

# line pp-tokens new-line

(与前两种形式之一不匹配)是允许的。行后的预处理标记对指令的处理与普通文本一样(当前定义为宏名称的每个标识符由其预处理令牌的替换列表替换)。如果指令在所有替换之后产生与前两种形式之一不匹配,行为未定义;否则,将处理结果视情况而定。

.y扩展名正是作者选择使用的,也许是为了表明它是一个YACC文件("grammar"一词也指出了这一点,尽管这只是猜测)。

它简单地说明当前代码行来源于CSSGrammar.y的第25行,这是一个YACC风格的语法文件,也是生成此代码的地方。

这可以被调试器用来进入语法本身,而不是生成的代码。

#line指令修改编译器的报告位置,并由代码生成软件用于帮助程序员识别原始源中的问题。任何人都可以使用它来帮助重定向错误报告,以获得更多信息。

例如,您的解析器生成一个CSSGrammar.cpp文件,该文件由c++编译器编译,其中包含c++代码段,#line 25 "CSSGrammar.y"指令告诉c++编译器将文件中的特定点视为CSSGrammmar.y 中的第25行

编译器将继续分析后续行,并在该指令的初始条件下报告错误。

因此,如果3行之后出现错误,它将报告CSSGramm.y 中的第28行出现错误

请注意,单个源文件可以具有来自多个部分的源;并且该指令可以非常有效地用于指示错误条件。

通常,您会看到一路上有多个#line指令;它们只是用来说明一路上的各种注入(如果愿意的话,可以重置报告插入符号)。

请注意,#line指令可以由ANY生成器(包括您自己的生成器)使用,并且不限于在任何语法分析器生成器中。

这是编译器认为以下行是文件CSSGrammar.y中的第25行的指令。然后,如果编译器在下一行的第2行检测到错误,则报告为来自CSSGrammar.y 的第26行

生成C文件的程序,如bisonyaccflex、ANTLR,甚至(过时的)MELT,都会大量使用这种可能性。

如果生成调试信息(例如,使用gcc -g),它将指向示例中的CSSGrammar.y文件。

‘yacc’解析器生成器使用以.y结尾的文件,并发出包含c或c++的文件。它添加了这些#行,以允许调试器返回到旧的原始源,不接受任何替换。

这是一个c预处理器选项。它告诉c语法分析器放弃源文件的行数并假装这是第25行。

有了这些信息,您可以更容易地调试源文件。yacc文件将被翻译成一个c源代码,这是一个伪源代码行。

使用#line会迫使编译器忘记正在编译的文件和所在的行,并加载新数据。

注意:编译器仍然从它所在的行进行编译。