Используя #define для включения другого файла в C++/C

Я хочу определить макрос, который включает другой заголовочный файл как так:

#define MY_MACRO (text) #include "__FILE__##_inline.inl"

Так, чтобы, когда препроцессор анализирует файл person.h, MY_MACRO (чепуха) расширился до

#include "person.h.inline.inl"

какие-либо подсказки, как сделать это?

17
задан Ahmad Mushtaq 5 July 2010 в 11:02
поделиться

3 ответа

Невозможно использовать #define для построения других директив препроцессора, если только вы не запустите препроцессор дважды.

Но в вашем случае даже двойной запуск препроцессора не поможет, потому что #include должно быть одной строкой вида "..." или <...>.

14
ответ дан 30 November 2019 в 13:33
поделиться

Вы не можете использовать __ FILE __ , потому что он уже заключен в кавычки, а #include не поддерживает конкатенацию строк. Но вы можете использовать макросы после #include :

#define STRINGIZE_AUX(a) #a
#define STRINGIZE(a) STRINGIZE_AUX(a)
#define CAT_AUX(a, b) a##b
#define CAT(a, b) CAT_AUX(a, b)
#define MY_MACRO(file, name) STRINGIZE(CAT(file, CAT(name, _inline.inl)))
#include MY_MACRO(aaaa, qqq)

Вы должны использовать эквивалентные макросы Boost.Preprocessor вместо CAT и STRINGIZE , чтобы предотвратить загрязнение глобального пространства имен.

10
ответ дан 30 November 2019 в 13:33
поделиться

Вы не можете писать другие директивы препроцессора, используя препроцессор. Однако, я полагаю, вы можете определить только имя файла:

#define MY_MACRO(name) "__FILE__##name_inline.inl"

#include MY_MACRO(name)

Препроцессор запускается несколько раз, пока не останется больше замен, поэтому он должен сначала расширить имя, а затем #include ссылающийся файл.

EDIT: Я только что попробовал это, и препроцессор не может обрабатывать кавычки таким образом.

#define MY_MACRO(x) <__FILE__##x_inline.inl>
#include MY_MACRO(foo)

работает нормально, но <> может быть не тем, что вы хотели.

EDIT2: Как указал кто-л. в комментариях, __FILE__ не расширяется правильно, что делает это, вероятно, не тем, что вы хотели в конце концов. Извините.

3
ответ дан 30 November 2019 в 13:33
поделиться