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;
}

如果放在TEST第 12 行,编译器会报错"error: ‘else’ without a previous ‘if’"
希望,这会帮助某人。

4

1 回答 1

5

这是为了避免宏被替换后出现的错误,例如,想想如果else你的第二个版本之后会发生什么。

于 2012-09-03T03:06:55.373 回答