C中的奇怪宏声明

时间:2012-09-03 03:03:40

标签: c libusb libusb-1.0

  

可能重复:
  Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
  do { … } while (0) what is it good for?

探索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’"
希望,这会对某人有帮助。

1 个答案:

答案 0 :(得分:5)

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