Написать макрос для C / C ++ #include - PullRequest
4 голосов
/ 25 июля 2011

Я работаю на AS / 400, который иногда не POSIX. Нам также нужно скомпилировать наш код в UNIX. У нас есть проблема с чем-то простым: # include.

В AS / 400 нам нужно написать:

#include "*LIBL/H/MYLIB"

В UNIX нам нужно написать

#include "MYLIB.H"

На данный момент у нас есть этот (уродливый) блок в верхней части каждого файла C / C ++:

#ifndef IS_AS400
    #include "*LIBL/H/MYLIB"
    /* others here */
#else
    #include "MYLIB.H"
    /* others here */
#endif

Нам нужен единый макрос. Это возможно? Я не знаю, как это написать.

В идеале результирующий синтаксис должен быть:

SAFE_INCLUDE("MYLIB")
, который будет корректно расширяться на каждой платформе.

Пожалуйста, сообщите.

Ответы [ 3 ]

6 голосов
/ 25 июля 2011

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

5 голосов
/ 25 июля 2011

Вы можете определить префиксы для вашей платформы как макрос. Как

#define STRINGY(STR) #STR
#define SAFE_INCLUDE(HDR) STRINGY(HDR)

#ifndef IS_AS400
#define SAFE_INCLUDE(LIB) STRINGY(*LIBL/H/##LIB)
#else
#define SAFE_INCLUDE(LIB) STRINGY(LIB##.H)
#endif

и вы можете использовать это как

#include SAFE_INCLUDE(MYLIB)
4 голосов
/ 25 июля 2011

Есть два лучших решения:

  1. Используйте ваши Makefiles, чтобы правильно указать путь, по которому компилятор будет искать включенные файлы. Для GCC вы добавляете в CFLAGS -I <path> (вы можете сделать это несколько раз).
  2. Оберните несовместимые библиотеки своими собственными заголовочными файлами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...