Условный #include в C
Есть ли способ сделать условное включение с препроцессором c?
У меня есть "библиотека" инструментов (Tools.c, Tools.h), которыми пользуются разные команды. Эта библиотека зависит от второй, предоставляющей XML-возможности. Давайте назовем это одним XML.h Теперь одна команда использует простую версию второй библиотеки (XML.h), в то время как другая команда использует расширенную версию (XMLEx.h) в своем проекте. Вторая группа не хочет включать XML.h, потому что в нее уже включен XMLEx.h, обеспечивающий все функции XML.h.
Есть ли механизм для реализации чего-то вроде:
#ifdef XML_EX
#include "XMLEx.h"
#else
#include "XML.h"
#endif
только с #define XML_EX
на более высоком (проектном) уровне? подобно
#include "Tools.h"
для команды 1 и
#define XML_EX
#include "Tools.h"
для команды 2? (Я знаю, что простое решение не будет работать, это больше для иллюстрации желаемого "рабочего процесса".)
Граничными условиями являются:
- Система Windows
- CVI/LawWindows IDE
- не делать файлы
- Tools.h должен компилироваться без внешнего проекта.
РЕДАКТИРОВАТЬ: Для предлагаемого решения и подсказка, что это распространенный способ, может быть, это как-то связано с моим процессом сборки, но это не работает. IDE жалуется на отсутствие XML.h для команды 2. Я полагаю, это потому, что IDE сначала пытается скомпилировать каждый исходный код самостоятельно, не зная о "внешнем" #define.
РЕДАКТИРОВАТЬ: Давайте представим, что команда A это кучка дебилов, которые могли бы нажать только кнопку "RUN" в IDE. Поэтому лучше всего работать из коробки.
РЕДАКТИРОВАТЬ: Хорошо, это озадачило меня. Все, что я узнал, говорит мне, это должно работать. Вот минимальный набор, который я тестировал:
main.c
#define XML_EX
#include "Tools.h"
void main(void)
{
test();
}
затем Tools.h
#ifdef XML_EX
#include "XMLEx.h"
#else
#include "XML.h"
#endif
XMLEx.h имеет тестовую функцию, а XMLEx.c реализует ее. Если я пытаюсь собрать, я получаю "XML.h not found". Все хорошо с #define XML_EX
в Tools.h.
3 ответа
У вас может быть файл team.h, который определяет любые макросы для команды A и не определяет их для команды B или определяет разные значения, и каждая команда будет иметь свою собственную копию team.h.
Каждый член команды может также передать это значение компилятору с помощью опции -D макроса (по крайней мере, компиляторы Linux поддерживают это). Я бы порекомендовал, если вы сделаете это, вы передадите TEAM_A или TEAM_B, чтобы дать вам больше гибкости в будущем и не нужно будет передавать больше макросов.
Решение, которое вы предлагаете, обычно используется, и это делается довольно часто. Вы также можете передать макрос в файл makefile / project.
Также обратите внимание, что Tools.h
является заголовочным файлом и всегда будет компилироваться как часть другого файла.
Я обманул себя. Как указано выше, в коде нет ничего плохого. Я неправильно интерпретировал сообщение об ошибке моей IDE.
Что касается примера, у меня был также Tools.c, и компиляция этого источника не удалась (естественно), потому что в моем проекте не было XML.h. Удаление исходного кода из проекта и просто ссылка на предварительно скомпилированные инструменты работает нормально.