C语言 使用行..file指令



为什么有人想要使用#line指令重置/更改程序中的当前行号或文件名,例如:

#line 10000 "somefile.c"
printf("File: %s, Line: %d", __FILE__, __LINE__)

有什么例子可以说明它是如何有用的?

该指令用于自动生成C代码的程序,如flex(1)yacc(1),以指示在原始源文件中插入的代码的位置。

假设您在一个文件中为yacc(1)制定了一个语法规范,该规范在某个时候将您提供给它的源代码插入到它生成的源文件(yy.tab.c)中,以便按字面意思替换。Yacc引入了对其源代码的引用,因此您可以回到原始.y文件并查看您编写的代码

如果你查看yacc创建的C源文件,你会发现像

这样的指令
#line 357 "myfile.y"
... /* your inserted code */
#line 20547 "yy.tab.c"
... /* more yacc generated code */
#line 380 "myfile.y"
... /* more literal code written by you */
#line 21250 "yy.tab.c"
...

,调试器将插入正确的引用到真正的源文件,而不是yacc处理的中间C源文件。

cpp预处理器指示文件的每次更改,通过在#include <stdio.h>扩展的开始插入#line 1 "stdio.h",并在从#include返回时插入#line 37 "my_original_source.c",以便在调试器信息中包含源代码中的适当行。如果对源代码进行预处理,就可以看到这种情况:

cpp mysourcefile.c | more

,你会看到一对#line指令在include入口点和include出口点,重置行计数器。

最新更新