【问题标题】:gcc: passing list of preprocessor definesgcc:传递预处理器定义列表
【发布时间】:2013-03-26 15:17:36
【问题描述】:

我有一个相当长的预处理器定义列表,我想将它们提供给使用 gcc 编译的几个 C 程序。

基本上我可以创建一个巨大的 -DDEF1=1 -DDEF2=2 ... 选项列表来传递给 gcc,但这会造成巨大的混乱,很难在版本控制系统中使用,并且可能在某些时候将来打破命令行长度限制。

我想在一个文件中定义我的定义。

基本上 -imacros 会做我想做的事,只是它只将它传递给第一个源文件:(下面来自 gcc 文档):

-include file 处理文件,好像#include "file" 出现在主要源文件的第一行。但是,搜索的第一个目录 for file 是预处理器的工作目录,而不是 包含主要源文件的目录。如果在那里找不到,那就是 在 #include "..." 搜索链的其余部分中搜索为 普通的。如果给出多个 -include 选项,则包含文件 按照它们在命令行中出现的顺序。

-imacros file 与-include 完全一样,只是扫描文件产生的任何输出都会被丢弃。它定义的宏保持定义。 这允许您从标头中获取所有宏,而无需 处理其声明。 -imacros 指定的所有文件都是 在 -include 指定的所有文件之前处理。

我需要在所有源文件中都有定义,而不仅仅是第一个。

【问题讨论】:

  • 您是否确认您确实正确阅读了文档?在我的理解中,“主源文件”并不一定意味着它只适用于第一个源文件或只适用于单个文件,而是作者只是想区分源文件和您使用-include-imacros 加载的文件。很可能作者只是假设了只有一个源文件的“简单”情况,因此他不想使措辞过于复杂和模棱两可。如果可行,我会尝试,很可能可行。
  • 我刚试过,它确实工作正常(使用 GCC-MinGW 4.7.1)。编译 两个 文件,这两个文件都使用宏,并且仅通过 -imacros 包含它。

标签: gcc c-preprocessor


【解决方案1】:

this reference的底部。

您可能想要的是@file 选项。这个选项告诉 GCC 使用file 作为命令行选项。这个文件当然可以包含预处理器定义。

【讨论】:

    【解决方案2】:

    老实说 - 听起来您需要在构建环境中做更多的事情。

    例如,一个建议是听起来您应该创建一个包含在所有源文件中的头文件并#define 所有定义。

    您也可以使用-include,但指定一个明确的路径 - 这应该在您的 Makefile/构建环境中确定。

    如果您的 Makefile 将每个源文件独立构建到其自己的目标文件中(这是典型的),则 -imacros 将起作用。听起来您只是将所有资源投入到构建单个对象中。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2011-01-14
      • 2018-09-12
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 2014-09-13
      • 2011-04-24
      相关资源
      最近更新 更多