Luc*_*ore 14 c++ c-preprocessor preprocessor-directive
以下几行有什么作用?
#line 25 "CSSGrammar.y"
Run Code Online (Sandbox Code Playgroud)
扩展有什么用?
Set*_*gie 14
根据标准:
§16.4.3:
表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# line digit-sequence new-line导致实现的行为就好像下面的源行序列以一个源行开头,该源行具有由数字序列指定的行号(解释为十进制整数).如果数字序列指定零或大于2147483647的数字,则行为未定义.
§16.4.4:
表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# line digit-sequence " s-char-sequenceopt" new-line类似地设置假定的行号,并将源文件的假定名称更改为字符串文字的内容.
§16.4.5:
表单的预处理指令
Run Code Online (Sandbox Code Playgroud)# line pp-tokens new-line(允许与前两种形式中的一种不匹配).指令行后的预处理标记的处理方式与普通文本一样(当前定义为宏名称的每个标识符都被其预处理标记的替换列表替换).如果在所有替换后得到的指令与前两个表单中的一个不匹配,则行为未定义; 否则,结果将被适当处理.
这个.y扩展正是作者选择使用的,也许是为了表明它是一个YACC文件("语法"这个词也指向了它,虽然它只是一个猜测).
它只是声明当前代码行来自CSSGrammar.yYACC样式语法文件的第25行,该文件是生成此代码的地方.
调试器可以使用它来进入语法本身,而不是生成的代码.
#line指令修改编译器的报告位置,代码生成软件使用它来帮助程序员识别原始源中的问题。任何人都可以使用它来帮助重定向错误报告以提供更多信息。
例如,您的解析器生成一个 CSSGrammar.cpp 文件,该文件由 c++ 编译器编译,其中包含 c++ 片段,#line 25 "CSSGrammar.y"指令告诉 c++ 编译器将文件中的特定点视为从第 25 行开始CSSGrammar.y
编译器将继续解析后续行并在该指令的初始条件下报告错误。
因此,如果在 3 行之后发生错误,它会报告 CSSGrammar.y 中的第 28 行发生错误
请注意,单个源文件可以包含来自多个部分的源;并且该指令可以非常有效地用于指示错误情况。
通常,您会看到#line一路上有多个指令;他们只是在那里解释沿途的各种注入(如果您愿意,可以重置报告插入符)。
请注意,#line 指令可以被任何生成器使用,包括您自己的生成器,并且不限于任何解析器生成器。