do { ....} while(0) 在宏里冗余的意义
生活随笔
收集整理的這篇文章主要介紹了
do { ....} while(0) 在宏里冗余的意义
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
do { ....} while(0) 在宏里冗余的意義
cocos2d-x提供了許多宏模板,如:CC_SAFE_RETAIN(p),CC_SAFE_DELETE(p) 等等
查看一下CC_SAFE_RETAIN的源碼:
#define CC_SAFE_RETAIN(p) do { if(p) { (p)->retain(); } } while(0)為什么要使用 do{}while(0)語句,它不是只執(zhí)行一次嗎?,為何看的這么令人費解呢?,它與直接使用if(){}語句有什么不同?
假設(shè)這里去掉do...while(0),
#define SAFE_DELETE(p) delete p; p = NULL;那么以下代碼:
if(NULL != p) SAFE_DELETE(p)存在問題:無論if判斷是否通過,p=NULL;這句都能執(zhí)行。
你可能發(fā)現(xiàn),為了避免這兩個問題,我不一定要用這個令人費解的do...while,? 我直接用{}括起來就可以了?
#define SAFE_DELETE(p) { delete p; p = NULL;}的確,這樣的話上面的問題是不存在了,但是我想對于C++程序員來講,在每個語句后面加分號是一種約定俗成的習(xí)慣,這樣的話,以下代碼:?
if(NULL != p) SAFE_DELETE(p); else ...因為if(exp){};else... 這連編譯都通不過。
所以采用do...while(0)是做好的選擇了,對于一個library的作者,他所要做的就是讓其庫具有通用性,我們不能指望所有人都習(xí)慣性的都寫成if(){}else{}這中方式。
?
?
?
?
?
posted on 2014-07-06 22:43 慵懶的貓 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/zouly/p/3828759.html
總結(jié)
以上是生活随笔為你收集整理的do { ....} while(0) 在宏里冗余的意义的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据可视化(9)--数据可视化6步法
- 下一篇: java轻量级Http Server