2009-05-29 3 views

答えて

131

セミコロンで表示し、見た目を良くし、機能のように動作させることができます。 if/else節も正しく動作します。

しばらくせずにマクロの後にセミコロンはelse節を「食べ」だろう、と上記のコンパイルすらないからである(0)、上記のコードは

if (doit) 
    INIT_LIST_HEAD(x); 
else 
    displayError(x); 

では動作しません。

+5

しかし、OPの質問には、略:

編集。 do {(ptr) - > next ...}ではなく{(ptr) - > next ...}なぜ(0);? –

+26

アルノはそれを説明しました。それは "{(ptr) - > next ...};に展開されます;"したがって、ステートメントの後に2番目のステートメントが続きます。 if if(expression)else else文です。 "if(expression)statement文"(1つの "{...}"文と1つの ";"文)を記述しているので、elseはifに関連付けられません。 –

+3

Amoは言ったように、マクロをセミコロンで終わらなければならないCステートメントにすることを賢明にしています。ステートメントの作成と終了( ';'付き)に関しては、マクロは関数呼び出しとまったく同じように動作します。 – Eddie

41

複数の文を1つのマクロにまとめることができます。

はあなたがやったようなものと仮定します。マクロは、封入せずに定義されていた場合

if (foo) 
    INIT_LIST_HEAD(bar); 

を(0);,上記のコードは

if (foo) 
    (bar)->next = (bar); 
    (bar)->prev = (bar); 

に展開するだろうが、{...}やりますfooが保持している場合、最初の文だけが実行されるため、これは意図したものではありません。 2番目のステートメントは、fooが保持しているかどうかにかかわらず実行されます。 http://c-faq.com/cpp/multistmt.htmlでさらに説明やhttp://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

+7

これは、マクロのdo .. while(0)部分については説明していませんが、{}を使うだけです。 – SPWorley

+0

do {}(0)の部分はこの記事で説明されていますが、これはdupです。 – adobriyan

+1

SPWorley、adobriyan:実際には、この投稿の作者がdo {} while(0)を説明するリンクを追加したようです。 – Jamer

関連する問題