6

C初心者として、次のコードを理解するのに苦労しています:

#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                           } while (0)

この関数が#defined である理由は、既存の関数をオーバーライドするためだと推測しましたが、無条件ステートメントdo ... while(0)を使用したループのポイントは何ですか? ループ構造なしでこれを書くことはできませんか? exit()

4

3 に答える 3

8

ここには多くの重複があると思います。

このdo...while(0)トリックにより、errExit何も壊さずにさまざまなコンテキストで使用できます。

if(x) errExit(msg);
else return 1;

は次のように翻訳されます。

if(x) do { ...; ...; } while(0);
else return 1;

この部分を省略するとdo...while(0)、たとえばセミコロンを確実に追加できません。

于 2013-03-21T14:35:55.107 に答える
2

マクロにdo { ... } while(0)ループがなく、内部に 2 つのステートメントがあるとします。さて、書いてみたらどうでしょう

if( foo() )
    errExit("foo!" );

私の条件付き出口は無条件出口になりました。

于 2013-03-21T14:35:21.707 に答える
1

このdo { ... } while(0)構文は、このような複数のステートメントのマクロ関数に対して一般的であり、通常はベスト プラクティスと見なされます。単一のステートメントとして使用できるため、驚くことはありません。

于 2013-03-21T14:36:19.093 に答える