為什麼使用do while 0

2021-06-22 06:02:09 字數 1075 閱讀 2331

最近學習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做跳出.當你執行一段...