1.使用do-while(0):爲了能夠在條件語句中使用複雜的宏定義。
#include <stdio.h>
#include <stdlib.h>
#define FOO(x) \
printf("x=%d\n",x); \
x++;
#define FOO2(x) \
do{ \
printf("x=%d\n",x); \
x++; \
}while(0)
int main()
{
printf("Hello world!\n");
int x = 5;
if(x==5)FOO2(x);
printf("x1=%d\n",x);
if(x==5)FOO(x);
printf("x2=%d\n",x);
return 0;
}
調用FOO(x)在條件語句if(x==5)之後,按照預期,此時x=6,應當不執行該調用。確實,並沒有執行printf("x=%d",x);但是執行了x++的操作,導致x2=7.
但是單純把宏定義的多條指令用{}括起來,問題出在調用FOO(x)後的 " ; ".如果不寫該分號,看起來不像函數調用,但是寫了這個分號。在{}之後就有個分號,把if語句結束了。如果if後面有else,則該else就無法匹配了。(編譯報錯)