繁体   English   中英

#line是什么意思?

[英]What does #line mean?

以下几行有什么作用?

#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文件(“语法”这个词也指向它,虽然它只是一个猜测)。

它只是声明当前代码行来自CSSGrammar.y第25 CSSGrammar.y ,这是一个YACC样式的语法文件,它是生成此代码的地方。

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

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

因此,例如,您的解析器生成一个CSSGrammar.cpp文件,由c ++编译器编译,并且其中包含c ++片段, #line 25 "CSSGrammar.y"指令告诉c ++编译器处理文件中的特定点好像它是来自CSSGrammar.y的第25行

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

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

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

通常你会发现沿途有多个#line指令; 他们只是在那里考虑各种注射(如果你愿意,重置报告插入符号)。

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

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

它是编译器相信以下行是文件CSSGrammar.y第25行的CSSGrammar.y 然后,如果编译器在第二行的下一行检测到错误,则会报告它来自CSSGrammar.y第26行。

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

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

它是交流预处理器选项。 它告诉c-parser丢弃它的源文件的行数假装,这是第25行。

有了这些信息,您就可以更轻松地调试源文件。 yacc文件将被转换为c-source,这是假装的源代码行。

使用#line会强制编译器体验它正在编译的文件以及它所在的行,并加载新数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM