#line是什么意思?

Luc*_*ore 14 c++ c-preprocessor preprocessor-directive

以下几行有什么作用?

#line 25 "CSSGrammar.y"
Run Code Online (Sandbox Code Playgroud)

扩展有什么用?

Set*_*gie 14

根据标准:

§16.4.3:

表单的预处理指令

# line digit-sequence new-line
Run Code Online (Sandbox Code Playgroud)

导致实现的行为就好像下面的源行序列以一个源行开头,该源行具有由数字序列指定的行号(解释为十进制整数).如果数字序列指定零或大于2147483647的数字,则行为未定义.

§16.4.4:

表单的预处理指令

# line digit-sequence " s-char-sequenceopt" new-line
Run Code Online (Sandbox Code Playgroud)

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

§16.4.5:

表单的预处理指令

# line pp-tokens new-line
Run Code Online (Sandbox Code Playgroud)

(允许与前两种形式中的一种不匹配).指令行后的预处理标记的处理方式与普通文本一样(当前定义为宏名称的每个标识符都被其预处理标记的替换列表替换).如果在所有替换后得到的指令与前两个表单中的一个不匹配,则行为未定义; 否则,结果将被适当处理.

这个.y扩展正是作者选择使用的,也许是为了表明它是一个YACC文件("语法"这个词也指向了它,虽然它只是一个猜测).


use*_*116 9

它只是声明当前代码行来自CSSGrammar.yYACC样式语法文件的第25行,该文件是生成此代码的地方.

调试器可以使用它来进入语法本身,而不是生成的代码.

  • 不仅适用于调试器:它还可以帮助编译器指出正确的错误来源. (4认同)

Ahm*_*sud 5

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

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

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

因此,如果在 3 行之后发生错误,它会报告 CSSGrammar.y 中的第 28 行发生错误

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

通常,您会看到#line一路上有多个指令;他们只是在那里解释沿途的各种注入(如果您愿意,可以重置报告插入符)。

请注意,#line 指令可以被任何生成器使用,包括您自己的生成器,并且不限于任何解析器生成器。