C 中的#line 关键字

问题描述 投票:0回答:5

我试图理解一些代码,但遇到了一个我以前从未见过的关键字。我尝试用谷歌搜索它,但也没有找到任何相关内容。

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”文件中。

提前致谢。

c line
5个回答
12
投票

A

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

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

最终参考是C 标准 (pdf),第 6.10.4 节。 (链接是该标准 1999 年版的 N1256 草案,该草案已过时,但

#line
的规范在后续版本中并未发生重大变化。)

表格的一行

#line number

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

#line number "file-name"

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

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

4
投票

#line
指令用于使用预处理器,以便可以将源代码的原始行号传达给C编译器。 它使得来自编译器的错误消息正确引用用户能够理解的行号。

例如,mycode.c 的第 12 行可能经过预处理器,现在是 mycode.tmp.cc 的第 183 行。 如果 C 编译器在该行发现错误,您不希望被告知错误位于 mycode.tmp.cc 的第 183 行。 所以C编译器需要给出每行的“原始坐标”。

#line
指令执行此操作,告诉编译器要在错误消息中使用的当前行号和文件名。



0
投票

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

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


0
投票

这样做是为了行号发生变化

这样做是为了显示 Lex 输入文件的行号,例如在错误消息和警告中。因为 Lex 生成 C 代码,所以如果没有

#line
指令,编译错误和警告将没有任何价值。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.