2

コードを生成する 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
}
4

1 に答える 1

3

残念ながら、X マクロは固有のものですが、最終的には単なるインクルード ファイルであるためです。これは#include <iostream>、独自の名前空間に配置することと同じです。

X-macro インクルードは、実際には何もしないで、ターゲット マクロ (定義はまだ決定されていません) を含める必要があります。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"
}
于 2012-10-18T21:18:01.087 に答える