如何从GCC命令行指定包含文件?

时间:2012-05-10 15:34:28

标签: gcc macros include

在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)。

有关如何实现这一目标的任何建议将不胜感激。

2 个答案:

答案 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)