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

編譯出錯(cuò),提示:else沒(méi)有匹配的if。
看起來(lái)上面沒(méi)有任何錯(cuò)誤,我開(kāi)始懷疑我的眼睛被使了障眼法,其實(shí)沒(méi)有什么障眼法,問(wèn)題在于CM_INFO_TRACE_THIS這個(gè)宏;看一下:
#define CM_INFO_TRACE_THIS(str) {TRACE(str);}

這樣就可以很顯然看出問(wèn)題了,確實(shí)else是沒(méi)有匹配的if,因?yàn)閕f語(yǔ)句已經(jīng)結(jié)束了。
這個(gè)就是宏定義的毛病;記得一個(gè)朋友也提過(guò),可以用do...while來(lái)終結(jié)這種問(wèn)題,如:
#define CM_INFO_TRACE_THIS(str) do{TRACE(str);}while(0)

那么現(xiàn)在發(fā)生什么變化了?
雖然在宏的后面多了一個(gè)分號(hào),但這剛好是while的結(jié)束。
對(duì)于宏后面不喜歡加分號(hào)的人,編譯器提示:缺少分號(hào),很容易發(fā)現(xiàn)錯(cuò)誤,不再以為是什么障眼法了。