Как мога да посоча включен файл от командния ред на GCC?

Използвайки GCC под Windows, бих искал да мога да посоча в командния ред на gcc (или от ръчно управляван makefile) името на конкретен включен файл, който да бъде включен в компилирания файл. Както виждам, в идеалния случай файлът с изходния код би съдържал ред нещо като...

#include INCLUDEFILENAME 

…тогава име на файл, указано в командния ред на gcc, ще бъде заменено с текста INCLUDEFILENAME.

Изглежда, че мога да се доближа до постигането на това, като дефинирам макрос, наречен INCLUDEFILENAME, в командния ред на gcc, използвайки опцията -D (напр. -D INCLUDEFILENAME="C:\TestLib\Test1.h"), но когато текстът на името на файла се замества в оператора #include, той не е ограден в двойни кавички и без те не се разпознават като файл за включване. Разбира се…

#include "INCLUDEFILENAME" 

...не работи, тъй като INCLUDEFILENAME след това се превръща в низов литерал и не се заменя от стойността на макроса. Опитах други начини за уточняване на двойните кавички (\x22, \", "\"" и т.н.), но те изглежда не работят на реда #include.

Наясно съм с опцията gcc -include, която изглежда може да принуди файл да бъде включен, без да бъде споменат по никакъв начин в изходния файл, но бих предпочел изходният файл да показва, че включващ файл трябва да бъде включен тук, но това името му е посочено „външно“ към изходния файл (в крайна сметка от make-файла).

Всякакви предложения за това как мога да постигна това ще бъдат оценени.


person Martin Irvine    schedule 10.05.2012    source източник


Отговори (2)


Трябва да включите двойните кавички " като част от дефиницията (или <>, в зависимост от случая):

% 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.
%
person Kevin    schedule 10.05.2012

Можете да използвате грозния, но класически трик за стрингификация:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#include STRINGIFY(INCLUDEFILENAME)
person emu    schedule 11.07.2016