#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
}

2

Решение

К сожалению, нет, потому что 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"}
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector