提问人:Luchian Grigore 提问时间:2/6/2012 最后编辑:Brian Tompsett - 汤莱恩Luchian Grigore 更新时间:4/15/2019 访问量:10013
#line 是什么意思?
What does #line mean?
答:
“yacc”解析器生成器使用以 .y 结尾的文件,并发出包含 c 或 c++ 的文件。它添加了这些 #line 行,以允许调试器返回到原始源代码,不接受任何替代。
它只是声明当前代码行源自 的第 25 行,这是一个 YACC 样式的语法文件,该文件是生成此代码的位置。CSSGrammar.y
调试器可以使用它来单步执行语法本身,而不是生成的代码。
评论
这是一个 C 预处理器选项。它告诉 c-parser 假装删除源文件的行数,这是第 #25 行。
有了这些信息,可以更轻松地调试源文件。yacc 文件将被翻译成 c-source,这是假装的源行。
根据该标准:
第16.4.3节:
表单的预处理指令
# line digit-sequence new-line
使实现的行为类似于以下源行序列以源行开头 具有由数字序列指定的行号(解释为十进制整数)。如果数字 sequence 指定零或大于 2147483647 的数字,则行为未定义。
第16.4.4节:
表单的预处理指令
# line digit-sequence " s-char-sequenceopt" new-line
以类似方式设置假定的行号,并将源文件的假定名称更改为内容 字符串文本。
第16.4.5节:
表单的预处理指令
# line pp-tokens new-line
(与前两种形式之一不匹配)是允许的。行后的预处理标记 在指令上处理,就像在普通文本中一样(当前定义为宏名称的每个标识符是 替换为其预处理令牌的替换列表)。如果指令在所有替换后产生 与前两种形式之一不匹配,行为未定义;否则,将处理结果 视情况而定。
扩展名正是作者选择使用的,也许是为了表明它是一个 YACC 文件(“语法”一词也指向了这一点,尽管这只是一个猜测)。.y
编译器认为以下行是文件中的第 25 行的指令。然后,如果编译器在下一行的第 2 行检测到错误,则该错误将报告为 来自CSSGrammar.y
CSSGrammar.y
生成 C 文件的程序,如 bison
、、、、、yacc
flex
如果生成了调试信息(例如,使用 ),它将指向示例中的文件。gcc -g
CSSGrammar.y
#line
指令修改编译器的报告位置,并由代码生成软件用于帮助程序员识别原始源代码中的问题。任何人都可以使用它来帮助重定向错误报告,以提供更多信息。
例如,您的解析器生成一个 CSSGrammar.cpp 文件,该文件由 c++ 编译器编译,其中包含 c++ 片段,一个指令告诉 c++ 编译器将文件中的特定点视为 CSSGrammar.y 中的第 25 行#line 25 "CSSGrammar.y"
编译器将继续解析后续行,并在该指令的初始条件下报告错误。
因此,如果 3 行后发生错误,它将报告 CSSGrammar.y 中的第 28 行发生错误
请注意,单个源文件可以包含来自多个部分的源;并且该指令可以非常有效地用于指示错误条件。
通常,您会看到在此过程中有多个指令;它们只是在那里解释沿途的各种注入(如果您愿意,可以重置报告插入符号)。#line
请注意,#line 指令可以由任何生成器使用,包括您自己的生成器,并且不限于解析器生成器。
使用 #line 会强制编译器对它正在编译的文件和它在哪一行上失忆,并加载新数据。
注意:编译器仍然从它所在的行编译。
上一个:C++ 程序的编译阶段是什么?
下一个:此 C++ 代码是什么意思?
评论