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