一段代:
if(0== nRet)
CM_INFO_TRACE_THIS("successfull");
else
CM_INFO_TRACE_THIS("fail");

編譯出錯,提示:else沒有匹配的if。
看起來上面沒有任何錯誤,我開始懷疑我的眼睛被使了障眼法,其實沒有什么障眼法,問題在于CM_INFO_TRACE_THIS這個宏;看一下:
#define CM_INFO_TRACE_THIS(str) {TRACE(str);}

這樣就可以很顯然看出問題了,確實else是沒有匹配的if,因為if語句已經結束了。
這個就是宏定義的毛病;記得一個朋友也提過,可以用do...while來終結這種問題,如:
#define CM_INFO_TRACE_THIS(str) do{TRACE(str);}while(0)

那么現在發生什么變化了?
雖然在宏的后面多了一個分號,但這剛好是while的結束。
對于宏后面不喜歡加分號的人,編譯器提示:缺少分號,很容易發現錯誤,不再以為是什么障眼法了。