為什麽使用do{}while(0)?
阿新 • • 發佈:2017-05-13
cocos2d else cocos sni 語句 解決問題 問題: 替換 pan
這裏使用do{}while(0)來確保語句塊被運行一次,那麽,能不能使用別的語法結構。完畢這種工作呢?
近期學習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)?