#line 指令和实际用法
Posted
技术标签:
【中文标题】#line 指令和实际用法【英文标题】:#line directive and real usages 【发布时间】:2014-11-25 09:38:48 【问题描述】:许多C书籍很少提及#line 指令。
他们中的许多人说这个指令被野牛工具的 yacc 使用,但没有 展示任何实际的例子。
谁能告诉我这个指令的一些实际用法或让我成为一个实用的 bison 或 yacc 的用法示例?
【问题讨论】:
man yacc
或 man bison
怎么样? (不想刻薄,但文档始终是首先开始的地方)。
用gcc -E
查看预处理器的输出(对于带有#include
的文件),例如(对于POSIX系统,c99 -E
)。
【参考方案1】:
从其他文件中的其他内容生成 C(或 C++)代码的任何程序或脚本也应该发出大量 #line
指令(将生成的 C 行与其他文件中的位置相关联)。
这对于诊断消息和调试器非常有用。
例如,在某个example.y
文件上运行GNU bison(解析器代码生成器),使用ANTLR,并查看生成的C 代码,或者开发然后构建,安装your GCC plugin(它可以修改源位置;另请参阅旧的 -obsolete- GCC MELT 项目,也许还有 Bismon),或查看 compilers translating to C 内部,如 Bigloo。
顺便说一句,根据经验,当您开发一个严肃的 C 或 C++ 代码生成器时,您需要发出正确的 #line
指令,这对代码生成器来说是一个很大的负担。这可能需要大量的工作。
在某些情况下,您可以选择不生成 #line
指令。 2021年,我们在RefPerSys项目中做出这样的选择。
【讨论】:
你能给我举个具体的例子吗?还有伪代码? 您的 MELT 网站链接已过期,现在指向一家不相关的公司。当前有效的链接是 starynkevitch.net/basile/gcc-melt,但请注意该网站声明 GCC Melt 项目自 2017 年底以来处于非活动状态。以上是关于#line 指令和实际用法的主要内容,如果未能解决你的问题,请参考以下文章