【发布时间】:2017-11-17 19:05:46
【问题描述】:
背景
我目前正在重构一个大型项目。问题之一是大量滥用字符串文字(300 多个实例)用于产品使用的公共路径(即引用 /opt/dev 和该位置的子路径),包括:
- C/C++ 源文件和头文件。
- python 脚本。
- bash 脚本。
- systemd 脚本。
- 二进制图像(驱动程序)。
目标
我想使用 GNU m4 来定义一个包含一组通用宏的文件,这样我们就可以“一次编写,到处使用”,这样如果我们的代码是分支的(典型的新产品),我们可以只更改该文件中的宏,而不是寻找重复的字符串文字并调试它们数天。这对于脚本之类的简单事物来说很容易,因为我只需在构建输出路径中创建源树的副本,然后直接在脚本上运行 M4。
问题
到目前为止,唯一的缺点是这看起来对于 C/C++ 项目来说将是一项巨大的工作,因为我只想在编译时执行 M4 宏扩展/替换。这意味着,为了避免修改从 git 签出的源文件,我将不得不修改我的构建脚本(大量 Makefile)来处理代码的临时副本,而不是原始源文件本身。否则,直接在受版本控制的源代码上运行M4 会生成对本地工作副本的更改,并且开发人员可能会将这个经过 M4 评估的代码副本提交给版本控制,从而破坏 M4 工作。
问题
是否可以通过某些外部工具或 GCC 本身的某些功能在编译期间指示 gcc 评估 m4 宏/扩展?如果没有,我的构建脚本可能需要进行大规模检修才能支持 M4 宏。
【问题讨论】:
-
使用
m4为 C 和/或 C++ 代码生成project-config.h标头。在需要使用其中一个宏的每个文件中使用该标题。确保程序员知道应该使用什么。可能在签入前或定期执行代码检查?当该标头更改时重新编译。不要不必要地改变它。 -
@JonathanLeffler 叹息,如此优雅和简单。不知道我怎么忽略了这一点。如果您将此转换为答案,我会将其标记为已接受。
标签: m4 gcc m4 c++ c linux gcc m4