2012-02-08 4 views
-1

私は次のように定義されたマクロに遭遇:cの特定の "do while"マクロの利点は?

#define CALL_FUNCS(x) 
do { 
    func1(x); 
    func2(x); 
    func3(x); 
} while (0); 

を、もちろんこれは動作しますが、これは以下のバージョンよりも良くする方法ですか?

#define CALL_FUNCS(x) 
{ 
    func1(x); 
    func2(x); 
    func3(x); 
} 

マクロ最適化に関するものではないと思います。これについての考えは?

+0

C++のよくある質問は[こちらには良い記事があります](http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.5) –

+0

ありがとうセスカーネギーポインタ:http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.5 –

+0

[C/C++マクロのDo-While文とif-else文の可能な複製](http ://stackoverflow.com/questions/154136/do-while-and-if-else-statements-in-cc-macros) – legoscia

答えて

4

マクロは実際には最終結果を持つべきではありません。これは何かが間違っていると、マクロの周りに通常の/より期待され、有用な構文エラーを得るためです。 else文の前に

if (bla) 
{ 
    func1(x); 
    func2(x); 
    func3(x); 
}; 
else statement; 

セミコロン:

if (bla) CALL_FUNCS(); 
else statement; 

は次のように前処理されます:あなたはif-else文でdo ... while (0)フォームを使用しない場合は

4

エラーが発生します無効です。

あなたはマクロ定義でdo ... while (0)後の最終;を置くべきではありません、あなたがしなければならないと定義行の後\を使用することに注意してください(@arsenmで指摘したように):

#define CALL_FUNCS(x) \ 
do {     \ 
    func1(x);   \ 
    func2(x);   \ 
    func3(x);   \ 
} while (0) 
+0

@SethCarnegieには、後に続く2つのセミコロンがあります。最初に、マクロの*定義*の末尾に不正確なセミコロンが追加されています。マクロがどのように使われているかを見てください。 'CALL_FUNCS(x);にセミコロンがあり、第2の形式を使っても消えません。 –

0

このマクロ呼び出しの後にユーザーに;を追加させるために使用されます。

3

まず、末尾に;を含めるべきではありません。それは次のようになります。

#define CALL_FUNCS(x) do { func1(x); func2(x); func3(x); } while (0) 

とにかく理由は次のとおりです。今、私たちはまだtrailling ;を持っていると、このエラーメッセージが表示されます

if(b) 
    { func1(x); func2(x); func3(x); }; 
else 
    something_else(x); 

:あなたが;を続ければ

error: ‘else’ without a previous ‘if’ 

注意、これはに拡大する

if(b) 
    CALL_FUNCS(x); 
else 
    something_else(x); 

を考えてみましょうマクロの場合、と2つのが末尾に; s!

マクロ展開は、最後にセミコロンが必要なもののように見えるべきです。 CALL_FUNCS(x)と入力しない場合は、CALL_FUNCS(x);に電話します。あなたはdo.. while(0)に依存してセミコロンをスラッシュアップすることができますが、{ }はそうしません。