使用 line...file 指令

Using the line...file directive

为什么有人想要使用 #line 指令 reset/change 程序中的当前行号或文件名的示例用法是什么,例如:

#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",并在从 #line 37 "my_original_source.c" 返回时插入一个 #line 37 "my_original_source.c" #include 在调试器信息中包含源代码中的正确行。如果你只是预处理源代码,你可以看到这种情况发生:

cpp mysourcefile.c | more

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