在Windows下使用GCC,我希望能够在gcc命令行(或从手动管理的makefile)中指定要包含在正在编译的文件中的特定包含文件的名称。在我看来,理想情况下,源代码文件将包含类似......
的行#include INCLUDEFILENAME
...然后在gcc命令行上指定的文件名将替换INCLUDEFILENAME
文本。
似乎我可以通过使用-D
选项(例如-D INCLUDEFILENAME="C:\TestLib\Test1.h"
)在gcc命令行上定义一个名为INCLUDEFILENAME的宏来实现这一点,但是当文件名文本被替换为{ {1}}语句它没有用双引号括起来,如果没有这些语句,它就不会被识别为要包含的文件。当然......
#include
...不起作用,然后INCLUDEFILENAME成为字符串文字并且不会被宏值替换。我尝试了其他方法来指定双引号(#include "INCLUDEFILENAME"
,\x22
,\"
等)但这些似乎不适用于"\""
行。
我知道gcc #include
选项似乎可以强制包含文件,而不会在源文件中以任何方式提及它,但我希望源文件指示包含文件将被包含在此处,但它的名称是在源文件的“外部”指定的(最终,来自makefile)。
有关如何实现这一目标的任何建议将不胜感激。
答案 0 :(得分:0)
您必须将双引号"
作为定义的一部分(或<>
,视具体情况而定):
% cat test.c
#include <stdio.h>
#include OTHERFILE
int main() { printf("%s\n", func()); }
% cat func.c
char *func() { return "It worked."; }
% gcc test.c -DOTHERFILE='"func.c"'
% ./a.out
It worked.
%
答案 1 :(得分:0)
你可以使用丑陋但经典的字符串化技巧:
#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#include STRINGIFY(INCLUDEFILENAME)