0

コードで:

#define MACRO(A,B) foo(A); bar(B)

if(true) {
    MACRO(A,B);
}

Astyle は、マクロ呼び出しの周りの括弧を削除します

if(true)
    MACRO(A,B);

幸いなことに、私は解決策を見つけました。を;マクロの中に入れれば、Astyleはそれを理解してくれます。

#define MACRO(A,B) foo(A); bar(B);

if(true) {
    MACRO(A,B)
}

それは良い解決策ですか、それは Astyle のバグですか、それとも私の誤解ですか?

4

2 に答える 2

4

悪いスタイルです。

絶対にマクロに複数のステートメントが必要な場合は、それらをdo whileループで囲みます (最後にセミコロンがないことに注意してください)。

#define MACRO(A,B) do { foo(A); bar(B); } while(0) 
于 2014-10-31T12:42:06.133 に答える
1

関数のようなマクロは、複数の理由から、常に悪いスタイルです。型の安全性が低く、読みにくく、デバッグ/保守が難しく、信じられないほどバグが発生しやすく、プログラムがさまざまな定義の不十分な動作などにさらされます。

中括弧のない制御ステートメントまたはループ ステートメントは危険なスタイルです。これにより、プログラムが多数の信じられないほど一般的なバグに対して脆弱になるためです。一部の人々は、「中かっこがない方がコードが読みやすくなる」と主張し (私自身もかつてこのキャンプに参加していました)、そのためにバグを書くことをスキップします。中括弧がないことは、遅かれ早かれ常にバグにつながります。

また、常に中括弧を使用する場合は、マクロを作成するときにさまざまなあいまいなトリックを使用する必要はありません。

よいスタイル:

void function (type A, type B)
{
  foo(A);
  bar(b)
}

if(true) 
{
  function(A, B);
}
于 2014-10-31T12:51:25.127 に答える