#line 是什么意思?

What does #line mean?

提问人:Luchian Grigore 提问时间:2/6/2012 最后编辑:Brian Tompsett - 汤莱恩Luchian Grigore 更新时间:4/15/2019 访问量:10013

问:

下面这行有什么作用?

#line 25 "CSSGrammar.y"

扩展程序是怎么回事?

C++ C-preprocessor 预处理器指令

评论

0赞 Vyktor 2/6/2012
只是出于好奇......哪个编译器吃这个?
1赞 Seth Carnegie 2/6/2012
@Vyktor它是标准的一部分
0赞 Pubby 2/6/2012
我敢肯定这是重复的。请参阅: gcc.gnu.org/onlinedocs/cpp/Line-Control.html
4赞 Vyktor 2/6/2012
嘟...谷歌的第一个链接:publib.boulder.ibm.com/infocenter/macxhelp/v6v81/...
1赞 Luchian Grigore 2/6/2012
@Vyktor :)) 是的,我不认为谷歌接受哈希符号。

答:

2赞 bmargulies 2/6/2012 #1

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

12赞 user7116 2/6/2012 #2

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

调试器可以使用它来单步执行语法本身,而不是生成的代码。

评论

4赞 R. Martinho Fernandes 2/6/2012
不仅适用于调试器:它还可以帮助编译器指出正确的错误源。
2赞 Jörg Beyer 2/6/2012 #3

这是一个 C 预处理器选项。它告诉 c-parser 假装删除源文件的行数,这是第 #25 行。

有了这些信息,可以更轻松地调试源文件。yacc 文件将被翻译成 c-source,这是假装的源行。

20赞 Seth Carnegie 2/6/2012 #4

根据该标准:

第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

3赞 Basile Starynkevitch 2/6/2012 #5

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

生成 C 文件的程序,如 bison、、、、yaccflex

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

8赞 Ahmed Masud 2/6/2012 #6

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

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

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

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

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

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

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

0赞 PoolloverNathan 4/15/2019 #7

使用 #line 会强制编译器对它正在编译的文件和它在哪一行上失忆,并加载新数据。

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