#include внутри x-макроса
Я хочу написать X-макрос, который генерирует некоторый код. Код зависит от нескольких заголовков и предназначен для генерации в пространствах имен.
Проблема в том, что включения xmacro включаются в пространства имен вызывающей стороны. Есть ли способ, как я могу это исправить?
Пример:
xmacro.hpp:
#include "foo.hpp"
struct bar {
BODY
};
#undef BODY
main.hpp:
namespace ns {
#define BODY int func();
#include "xmacro.hpp" // inserting foo.hpp inside namespace ns
}
1 ответ
К сожалению, нет, потому что X-макросы, будучи уникальными, в конечном итоге все же являются просто включенными файлами. Это ничем не отличается от сдачи #include <iostream>
в ваше собственное пространство имен.
Включения X-макроса на самом деле не должны делать ничего, кроме как содержать целевой макрос (определение которого еще предстоит определить). Если использование вашего X-макроса имеет предпосылки, я бы сделал что-то вроде этого:
xmacro_prelude.hpp:
#ifndef XMACRO_PRELUDE_INCLUDED
#define XMACRO_PRELUDE_INCLUDED
#include "foo.hpp"
#endif
xmacro.hpp (кстати, обычно с суффиксом.def):
#ifndef XMACRO_PRELUDE_INCLUDED
#error "You must include xmacro_prelude.hpp prior to using this X-macro."
#endif
struct bar {
BODY
};
#undef BODY
main.hpp:
#include "xmacro_prelude.hpp"
namespace ns {
#define BODY int func();
#include "xmacro.hpp"
}