Столкнувшись с вопросом, можно ли выбрать #include
s в препроцессоре, я сразу подумал невозможно.
.. Только чтобы позже узнать, что это действительно возможно, и вам нужно только следить за расширения аргументов (о которых может позаботиться, например, Boost.Preprocessor).
Хотя я бы не стал делать это для включений, если это возможно, я хотел бы знать, почему это работает. На данный момент мне не удается получить полезное представление о стандарте C++ или C.
Разрешены ли параметризованные макросы для любой директивы препроцессора? (кроме #define
/#undef
)
Может ли кто-нибудь указать, где это разрешено, и подвести итог?
Пример любопытного использования Boost.Preprocessor для простоты:
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>
#define INC_LOCAL(a,b) BOOST_PP_STRINGIZE(BOOST_PP_CAT(BOOST_PP_CAT(a,b),.h))
#define INC_GLOBAL(a,b) BOOST_PP_CAT(BOOST_PP_CAT(<,a),BOOST_PP_CAT(b,>))
#include INC_LOCAL(loc,al) // #include "local.h"
#include INC_GLOBAL(vect,or) // #include <vector>
Обновление: ссылка на стандарт C, уточненный вопрос.