我想将包含文件的名称作为编译器参数传递,以便我可以修改大量配置参数。但是,我的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)
由于同样的原因不起作用。
出于脚本原因,我宁愿在命令行上执行此操作,也不要在相应的例程中编辑包含行。有什么办法吗?
答案 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”,结果可能因编译器而异。