閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

BOOST_PP_REPEAT の引数ではまった

letsboost::preprocessor(Let's Boost) を猿真似して BOOST_PP_REPEAT を使ったコードを書いたらエラーが出てしばしはまりました。

#define HAGE(n, _) int Hage ## n;
BOOST_PP_REPEAT(5, HAGE, nil);

こんなのを書いたら、 BOOST_PP_REPEAT の第一引数を 2 以上にした時にエラー(C2365)が大量に。変数の多重定義だなんて、そんなはずはっ!

悩みながら公式のリファレンス BOOST_PP_REPEAT を見たら、サンプルソースがちょっと違う。

#define DECL(z, n, text) text ## n = n;
BOOST_PP_REPEAT(5, DECL, int x)

どうやら、 BOOST_PP_REPAT に渡したマクロの第一引数には、現在の番号ではなく繰り返しの回数が入るらしい。つまり最初に自分が書いたコードは以下のように展開されていたみたいです。

int Hage5;
int Hage5;
int Hage5;
...

orz

ということで HAGE マクロの引数を上記サンプルのように変えたところ、正常に動作してくれました。めでたしめでたし。というか、最初に公式のドキュメント読めと。