のように、任意のコード ブロックをパラメータとして受け入れるマクロを作成したい
FOR_VECTOR( type, vect, code_block ) \
for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \
code_block; \
}
問題は、パラメータのコード ブロックです。これには、任意の数の文字が含まれている可能性があり,
ます )
。
良い解決策はありますか?
考えられる解決策はいくつかあります。
式が 1 つだけ必要な場合 (完全なコード ブロックではありません)、それを(
とで囲むだけです。)
FOR_VECTOR( int, v, (func(i,1)) )
動作します -(func(i,1))
単一のマクロ引数のように扱われます
プリプロセッサがサポートしている場合、別の部分的な解決策はvariadic macrosです。
マクロを定義できます
#define COMMA ,
#define LPAR (
#define RPAR )
それらを使用して、実際の代わりにコードブロックを形成し(
,
、)
FOR_VECTOR( int, v, func LPAR i COMMA 1 RPAR )
しかし、それは非常に読みやすいものではありません。
または、マクロ置換後に文字列リテラルの引用符をコメントアウトして、トリックを実行できます。
FOR_VECTOR( type, vect, code_block ) \
for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \
/code_block/; \
}
FOR_VECTOR( int, v, *"*/ func(i,1); proc(i,2); /*"* )