#line 指令和实际用法

Posted

技术标签:

【中文标题】#line 指令和实际用法【英文标题】:#line directive and real usages 【发布时间】:2014-11-25 09:38:48 【问题描述】:

许多C书籍很少提及#line 指令。

他们中的许多人说这个指令被野牛工具的 yacc 使用,但没有 展示任何实际的例子。

谁能告诉我这个指令的一些实际用法或让我成为一个实用的 bison 或 yacc 的用法示例?

【问题讨论】:

man yaccman 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 指令和实际用法的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js自定义指令的用法与实例

awk指令用法详解

在宏参数中使用 #line 指令是不是合法?

Linux下addr2line命令用法

对 __LINE__ 指令的一致性有任何保证吗?

在 c# 中使用 #line 指令来更改错误或警告的默认行号的原因是啥?