在C ++预处理器中为参数添加引号

时间:2011-07-12 21:57:16

标签: c++ c-preprocessor double-quotes

我想将包含文件的名称作为编译器参数传递,以便我可以修改大量配置参数。但是,我的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 个答案:

答案 0 :(得分:32)

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

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

#ifdef FILE_ARG
#include QUOTE(FILE_ARG)
#endif

答案 1 :(得分:4)

你可以做到

#ifdef FILE_ARG
#include FILE_ARG
#endif

在命令行上

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

应该这样做。

答案 2 :(得分:1)

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

gcc手册:

  

-include file

     

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

答案 3 :(得分:0)

适合我。也许你忘了在你的Makefile中正确引用?

$ cat example.c
#include FILE_ARG

$ cat test.h
#define SOMETHING

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

编辑: 您可能无法引用工作的原因是因为预处理器在phases中工作。另外我使用“gcc(Ubuntu / Linaro 4.5.2-8ubuntu4)4.5.2”,结果可能因编译器而异。