Я хочу определить макрос, который включает другой заголовочный файл как так:
#define MY_MACRO (text) #include "__FILE__##_inline.inl"
Так, чтобы, когда препроцессор анализирует файл person.h, MY_MACRO (чепуха) расширился до
#include "person.h.inline.inl"
какие-либо подсказки, как сделать это?
Невозможно использовать #define
для построения других директив препроцессора, если только вы не запустите препроцессор дважды.
Но в вашем случае даже двойной запуск препроцессора не поможет, потому что #include
должно быть одной строкой вида "..."
или <...>
.
Вы не можете использовать __ 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
, чтобы предотвратить загрязнение глобального пространства имен.
Вы не можете писать другие директивы препроцессора, используя препроцессор. Однако, я полагаю, вы можете определить только имя файла:
#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__
не расширяется правильно, что делает это, вероятно, не тем, что вы хотели в конце концов. Извините.