Заставить препроцессор C игнорировать определенные директивы #include

Здесь я использую генератор синтаксического анализатора, который, к сожалению, настаивает на добавлении

#include <some/file.h>

вверху каждого сгенерированного исходного файла. Шапка уже давно переименована. Хотя заставить компилятор (gcc) использовать новый заголовок с -include new/header.h не проблема, удаление указанной выше директивы из каждого сгенерированного файла усложняет процесс сборки.

Есть ли способ сказать gcc просто игнорировать some/file.h?


person edgar.holleis    schedule 13.01.2009    source источник


Ответы (5)


Нет. Вы можете постобработать сгенерированный файл - я говорю: НЕТ!!!

Или вы можете просто добавить '.' в системные каталоги включения (или любой другой локальный путь включения — убедитесь, что это также системный путь включения ‹>).

Затем создайте каталог «some» и вставьте туда свой собственный постоянный «file.h», в котором есть 1 строка для #include, и избавьтесь от вашего -include.

Я предполагаю, что есть какая-то причина, по которой это может не сработать, потому что кажется, что это более прямолинейно и понятно, прежде чем использовать -include. Тем более, что вы можете прокомментировать сквозной файл, чтобы объяснить, что происходит.

person Joe    schedule 13.01.2009

Замените some/file.h пустым файлом.

person Bombe    schedule 13.01.2009
comment
Нет, потому что это системный заголовок. Но с -я. в любом случае можно заставить gcc найти его. Спасибо. - person edgar.holleis; 13.01.2009

Почему бы не сделать символическую ссылку из some/file.h в new/header.h и удалить директиву -include?

person FreeMemory    schedule 13.01.2009
comment
Потому что раньше это был системный заголовок, находящийся в /usr/include. Нет необходимости модифицировать /usr/include только для того, чтобы скомпилировать какое-то приложение. - person edgar.holleis; 14.01.2009

Попробуйте использовать директивы препроцессора, такие как #if и #ifdef и gcc -DSYMBOL=value< /strong> флаг командной строки.

Например, если вы компилируете с помощью gcc -DREQUIRE_STDC=1 -o myfile.o myfile.c, и ваш файл .c содержит:



#if defined(REQUIRE_STDC) && defined(__STDC__)
#include "some/file.h"
#else
#include "another/file.h"
#endif /* defined(REQUIRE_STDC) && defined(__STDC__) */

Он будет компилироваться с использованием «some/file.h», если определены символы STDC и REQUIRE_STDC. Также ваш заголовок может включать правильную директиву, чтобы избежать многократного включения одного и того же файла:



#ifndef MY_HEADER_FILE
#define MY_HEADER_FILE 1

/* your C declarations here */

#endif /* MY_HEADER_FILE */

Кроме того, вы можете ознакомиться с руководством по препроцессору gcc.

person daniel    schedule 13.01.2009
comment
Это возможно для обычных исходных файлов. В моем случае источник генерируется на лету, и у меня нет необходимого контроля над его результирующим выводом. - person edgar.holleis; 14.01.2009

#include <some/file.h>

может начинаться как что-то вроде

#ifndef _FILE_H_
#define _FILE_H_

Если это так, просто добавьте #define _FILE_H_ перед командой #include, и она должна игнорироваться. Однако я не уверен, что это лучшее решение.

person luiscubal    schedule 13.01.2009