【问题标题】:Use gcc preprocessor to define filename for #include使用 gcc 预处理器为#include 定义文件名
【发布时间】:2017-06-02 04:36:06
【问题描述】:

我想在编译时将 C 包含文件的名称指定为 C 标志。

例如

#include MY_INCLUDE_FILE
int main(int argc, const char * argv[]) {...}

将被预处理器扩展为

#include "some_incfile.h"
int main(int argc, const char * argv[]) {...}

做这样的事情

gcc -DMY_INCLUDE_FILE="some_incfile.h" main.c

我曾尝试使用字符串化操作符 # 来展开,但只得到了诸如 error: expected "FILENAME" or <FILENAME> 之类的错误

这甚至可能吗? -D define 不是完全必要的,重要的是可以从 gcc 命令行设置包含文件名

【问题讨论】:

  • 思路不错,问题是引号的shell扩展

标签: c gcc compilation c-preprocessor


【解决方案1】:

你必须转义 ":

gcc -DMY_INCLUDE_FILE=\"some_incfile.h\" main.c

【讨论】:

  • 这么简单……当然应该记得逃跑"。这很好用,也是我要求的,所以这是公认的答案。 anonymoose 的回答也解决了我的问题。
【解决方案2】:

使用 -include 选项。

gcc -include "somefile.h" main.c

【讨论】:

  • 不完全符合我的要求,但同样很好地解决了它,甚至可能以更优雅的方式。
【解决方案3】:

你可以这样做

#  if defined AAA
#define INC "x.h"
#elif defined BBB
#define INC "y.h"
#endif

#include INC

然后从命令行执行gcc -DAAA

当然,如果文件真的是从外部、makefile等随机生成的,你可以直接传递gcc -DINC="\"FILE.h\""

重要的是 INC 将通过宏扩展过程评估为有效的文件名(请参阅 Prosser 算法)。

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2017-03-05
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多