Linux 編程的tricky 一:宏定義中的do-while(0)

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就無法匹配了。(編譯報錯)

發佈了38 篇原創文章 · 獲贊 9 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章