最近學習cocos2d-x,看到不少使用do{}while(0)的巨集定義,如:
#define cc_safe_delete(p) do while(0)
這裡使用do{}while(0)來確保語句塊被執行一次,那麼,能不能使用別的語法結構,完成這樣的工作呢?
1、直接使用{}語句塊
#define cc_safe_delete(p)
使用下面的**:
if(p)
cc_safe_delete(p);
else
...
編譯器會報錯,因為**實際上被替換為了
if(p)
;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) else {}
這樣,顯得**比較臃腫。注意,後面的else是不能省略掉的,否則,在if-else巢狀語句時,也會出現問題。
這裡需要注意的是,do{}while()語句需要新增";"。
使用do{}while(0),能夠讓開發者能夠以最小的代價來使用庫,庫作者不需要對開發者有更高的編碼要求,提高庫**的健壯性。
巨集定義為什麼要使用do while 0 形式
如果你是一名c程式設計師,你肯定很熟悉巨集,它們非常強大,如果正確使用可以讓你的工作事半功倍。然而,如果你在定義巨集時很隨意沒有認真檢查,那麼它們可能使你發狂,浪費n多時間。在很多的c程式中,你可能會看到許多看起來不是那麼直接的較特殊的巨集定義。下面就是乙個例子 1 2 define set tas...
使用do while 0 的好處
看到乙個比較好的帖子,給大家分享下!cpp view plain copy define lfw x,y do while 0 cpp view plain copy api while 0 1.替代 實現區域性作用域.在一些c的實現裡也可以用.2.避免使用goto,用break做跳出.當你執行一段...
使用do while 0 的好處
看到乙個比較好的帖子,給大家分享下!cpp view plain copy define lfw x,y do while 0 cpp view plain copy api while 0 1.替代 實現區域性作用域.在一些c的實現裡也可以用.2.避免使用goto,用break做跳出.當你執行一段...