C++と色々

主にC++やプログラムに関する記事を投稿します。

BOOST_PP_REPEAT

BOOST_PP_REPEATは引数に渡されたマクロを指定回数分展開するマクロです。
書式は以下のようになります。

BOOST_PP_REPEAT(c, m, d)

cは、何回引数に渡されたマクロを展開するかの回数を指定します。
例えば5を入れれば指定されたマクロは5回展開されます。
mは、繰り返し展開したいマクロを指定します。BOOST_PP_REPEATに渡すマクロには展開時、BOOST_PP_REPEATが3つまで意味のある引数を渡します。*1

#define HOGE

としたとき、

BOOST_PP_MACRO(5, HOGE, 100)

と書くと、このような感じに展開します

(2, 0, 100) (2, 1, 100) (2, 2, 100) (2, 3, 100) (2, 4, 100)

何個か例を出すと説明するよりもわかりやすいと思います。

#define HOGE hoge
BOOST_PP_REPEAT(5, HOGE, 100)

展開後

hoge(2, 0, 100) hoge(2, 1, 100) hoge(2, 2, 100) hoge(2, 3, 100) hoge(2, 4, 100)

例2

#define HOGE(z, n, d) int hoge##n = d;
BOOST_PP_REPEAT(5, HOGE, 100)

展開後

int hoge0 = 100; int hoge1 = 100; int hoge2 = 100; int hoge3 = 100; int hoge4 = 100;

BOOST_PP_REPEATに渡すマクロが展開される際の、各引数に渡されるシンボルを説明します。
BOOST_PP_REPEATに渡すマクロの書式は基本的にこのようになります

#define MACRO(z, n, d)

zは、最適化に使われるそうです。上記の例だと2に置換されています。殆どの場合気にしなくていいでしょう。
nは現在の繰り返し回数が入ります。dはBOOST_PP_REPEATの第3引数に指定したシンボルが入ります。

ちなみに、VCでは、コンパイルオプションに、/EPをしていするとマクロ展開後のソースファイルをみることができます(たくさん空行が入ってしまって間延びしてしまいます。空行を消す方法もあるみたいですが、自分は面倒くさいのでしていません)

後、同じ行為を表すのに何通りかの表現で揺らいでしまって申し訳ありません。普通のソースコードと違ってプリプロセッサには値の意味はなく、単に記号で、記号の置換が行われているだけなので、通常と違う表現をしないといけないと思いました。しかしプリプロセッサの説明に慣れていないのでグダグダな感じに…

*1:関数マクロを展開するのに、そのマクロの引数の数が足りなかろうが、余分に渡されようが全くエラーではないのでBOOST_PP_REPEATに渡すマクロは引数を3つ持つ関数マクロでなければならない、と断言できないのがもどかしいです