Условный #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. Удаление исходного кода из проекта и просто ссылка на предварительно скомпилированные инструменты работает нормально.

Другие вопросы по тегам