1

重複の可能性:
C/C++ マクロに無意味な do/while ステートメントと if/else ステートメントがあるのはなぜですか?
do { … } while (0) 何の役に立つの?

libusb-1.0.9 のソース コードを調べていると、次のような行 ( ./os/poll_windows.c:78)が見つかりました。

#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0)

私に関しては、これは次のようなものです:

#define CHECK_INIT_POLLING if(!is_polling_set) init_polling();

その式をループする理由はありますか?

アップデート:

答えた後、何が悪いのかまだわかりませんでした。次の例が役に立ちました。

#include <stdio.h>

#define TEST if(test) foo();
#define TEST_DO do { if(test) foo(); } while(0)

int test = 1;
void foo() {
    printf("%s", "Foo called");
}

int main(int argc, char** argv) {
    if(argc > 1) TEST_DO; /* LINE 12 */
    else printf("%s", "skipping...");

    return 0;
}

12行目に置くTESTと、コンパイラはエラーを出します"error: ‘else’ without a previous ‘if’"
うまくいけば、これは誰かを助けるでしょう。

4

1 に答える 1

5

elseマクロが置換された後に表示されるエラーを回避するためです。たとえば、 2 番目のバージョンの後に がある場合に何が起こるかを考えてください。

于 2012-09-03T03:06:55.373 に答える