为什么有人想要使用#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出口点,重置行计数器。