34

我想将包含文件的名称作为编译器参数传递,以便我可以修改大量配置参数。但是,我的 C++ 构建是通过一个类似于 makefile 的过程,该过程从传递给编译器和预处理器的参数中删除引号。我希望做一些相当于

#ifndef FILE_ARG
// defaults
#else
#include "FILE_ARG"
#endif

使用我的命令行,包括 -DFILE_ARG=foo.h。这当然不起作用,因为预处理器不翻译 FILE_ARG。

我试过了

#define QUOTE(x) #x
#include QUOTE(FILE_ARG)

出于同样的原因,这不起作用。

出于脚本原因,我宁愿在命令行上执行此操作,也不愿在适当的例程中编辑包含行。有什么办法吗?

4

4 回答 4

52

要添加引号,您需要这个技巧:

#define Q(x) #x
#define QUOTE(x) Q(x)

#ifdef FILE_ARG
#include QUOTE(FILE_ARG)
#endif
于 2011-07-12T22:01:03.090 回答
8

你可以做

#ifdef FILE_ARG
#include FILE_ARG
#endif

在命令行上

$ gcc -DFILE_ARG="\"foo.h\"" ...

应该做的伎俩。

于 2011-07-12T22:30:36.657 回答
2

您也可以尝试使用 -include 开关。

gcc手册:

-包含文件

处理文件,好像#include "file" 出现在主要源文件的第一行。但是,搜索文件的第一个目录是预处理器的工作目录,而不是包含主源文件的目录。如果在此处未找到,则会在 #include "..." 搜索链的其余部分中正常进行搜索。如果给出了多个 -include 选项,则文件将按照它们在命令行中出现的顺序被包含在内。*

于 2011-07-12T22:28:13.030 回答
0

为我工作。也许你忘了在你的 Makefile 中正确引用?

$ 猫示例.c
#include FILE_ARG

$猫测试.h
#定义一些东西

$ gcc -Wall -Wextra -W -DFILE_ARG=\"test.h\" -c example.c
$

编辑:您可能无法让报价工作的原因是因为预处理器分阶段工作。此外,我使用了“gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2”,结果可能因编译器而异。

于 2011-07-12T22:17:42.163 回答