#include在x-macro中

时间:2012-10-18 20:57:24

标签: c++ c-preprocessor x-macros

我想编写一个生成一些代码的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
}

1 个答案:

答案 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"
}