C中的#line关键字

时间:2011-08-18 14:57:17

标签: c line

我正在尝试理解一些代码,并且我遇到了一个我以前从未见过的关键字。我试图谷歌它,但也没有找到任何关于它的东西。

char *valtext;
#line 1 "Values.l"
#define INITIAL 0
#line 2 "Values.l"
int reserve(char *s);
#line 388 "lex.val.c"

我已经包含了整个块,希望有人可以帮助我理解这段代码。我在我的系统上找不到名为“Values.l”的任何文件,这段代码位于“lex.val.c”文件中。

提前致谢。

5 个答案:

答案 0 :(得分:10)

#line指令设置编译器的当前文件名和行号的设置。这会影响__FILE____LINE__符号,失败的assert()生成的输出以及诊断消息(错误和警告)。它通常由预处理器使用,因此错误和警告消息可以引用原始源代码,而不是预处理器的输出(通常在您看到任何消息时丢弃)。

它也被生成C源代码的其他工具使用,例如lex / flex和yacc / bison,因此错误消息可以引用输入文件而不是(临时)生成的C代码。

最终参考是the C standard(pdf),第6.10.4节。

表格的一行

#line number

设置当前行号。表格的一行

#line number "file-name"

设置行号和文件名。您还可以通过宏扩展生成这两种形式中的一种;例如:

#define LINE 42
#define FILE "foo.c"
#line LINE FILE

答案 1 :(得分:4)

#line指令用于预处理程序,因此可以将源的原始行号传递给C编译器。它使编译器的错误消息正确引用用户将理解的行号。

例如,mycode.c的第12行可以通过预处理器,现在是mycode.tmp.cc的第183行。如果C编译器在该行上发现错误,则不希望被告知错误在mycode.tmp.cc的第183行。因此需要为C编译器提供每行的“原始坐标”。 #line指令执行此操作,告诉编译器在错误消息中使用的当前行号和文件名。

答案 2 :(得分:1)

答案 3 :(得分:0)

该代码已通过预处理器,因此由编译器的一个阶段标记,旨在由同一编译器的另一个阶段使用。它使用的功能不适合您使用。

它引用的文件可能是编译器在运行时创建的临时文件。

答案 4 :(得分:0)

这样做the line number changes

这样做是为了显示Lex输入文件的行号,例如,在错误消息和警告中。因为Lex生成C代码,没有#line指令编译错误,警告也没有任何价值。