17

のように、任意のコード ブロックをパラメータとして受け入れるマクロを作成したい

FOR_VECTOR( type, vect, code_block ) \
  for( vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i ) { \
    code_block; \
  }

問題は、パラメータのコード ブロックです。これには、任意の数の文字が含まれている可能性があり,ます )

良い解決策はありますか?

4

2 に答える 2

12

考えられる解決策はいくつかあります。

式が 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); /*"* )
于 2013-08-31T21:29:15.847 に答える