我想编写一个生成一些代码的x-macro。代码依赖于几个头,并且旨在在命名空间内生成。
问题是xmacro的include包含在调用者的名称空间内。有什么方法可以解决这个问题吗?
示例:
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
}
答案 0 :(得分:3)
不幸的是没有,因为X-macros虽然是唯一的,但最终仍然只包含文件。这与将#include <iostream>
放入您自己的命名空间没什么不同。
X-macro包括除了包含目标宏(其定义尚待确定)之外,实际上不应做任何事情。如果你的X-macro的使用有先决条件,我会做这样的事情:
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"
}