1. 程式人生 > >為什麽使用do{}while(0)?

為什麽使用do{}while(0)?

cocos2d else cocos sni 語句 解決問題 問題: 替換 pan

近期學習Cocos2d-x,看到不少使用do{}while(0)的宏定義,如:

#define CC_SAFE_DELETE(p)           do { delete (p); (p) = nullptr; } while(0)

這裏使用do{}while(0)來確保語句塊被運行一次,那麽,能不能使用別的語法結構。完畢這種工作呢?


1、直接使用{}語句塊

#define CC_SAFE_DELETE(p)           { delete (p); (p) = nullptr; }

使用以下的代碼:

if(p)
    CC_SAFE_DELETE(p);
else
    ...

編譯器會報錯。由於代碼實際上被替換為了

if(p)
    { delete (p); (p) = nullptr; }
;
else
    ...

註意這裏的";"是另外的一行。第一個if語句是沒有else子句的。接下來是一個空語句,然後是else,這個else沒有相應的if語句。編譯器報錯。

使用if語句的時候,有一個須要註意的地方:即使是單行語句,也要使用{}括起來,以後維護代碼的時候。不會由於在單行語句前面加入了某些代碼,導致此單行語句溢出if控制塊。

當然,假設直接使用CC_SAFE_DELETE宏,不在宏後面加入分號,能夠解決問題:

if(p)
    CC_SAFE_DELETE(p)
else
    ...

可是。作為一名C++程序猿,差點兒會本能的在語句最後面加入上";"


2、使用if(1)語句塊

 #define CC_SAFE_DELETE(p)           if(1) { delete (p); (p) = nullptr; } else {}

這樣,顯得代碼比較臃腫。

註意。後面的else是不能省略掉的,否則,在if-else嵌套語句時。也會出現故障。


這裏須要註意的是。do{}while()語句須要加入";"。

使用do{}while(0),可以讓開發人員可以以最小的代價來使用庫,庫作者不須要對開發人員有更高的編碼要求。提高庫代碼的健壯性。




為什麽使用do{}while(0)?