關於do{}while(0),大家肯定不會陌生,就是do 裡面的迴圈體執行一次,且僅執行一次。那這樣和普通的語句有什麼區別呢?在巨集中,這樣做是為了保證巨集的正確執行(行為一致),就跟if(n ==0 ) ,大家會寫成if(0 == n) 一樣。一下是乙個例子,便於理解。
#include "stdio.h"
#define division(x,y) add((x) , (y));\
div((x), (y))
int add(int x, int y)
int div(int x, int y)
int main(int argc, _tchar* argv)
看著個例子,!flag為null,division的巨集中的add(),div()是不應該被執行的。但實際的結果確是
那麼為什麼會出現這種現象呢?當我們按照巨集進行替換時,**就會變成這樣
if(!flag) add(6,2);div(6,2);
編譯器便會認為成這樣:
if(!flag)
add(6,2);
div(6,2);
所以便會出現非預期現象。所以為了保證巨集在任何情況下的一致性,則需加上do{}while(0)語句。
#define division(x,y) \
do\ while(0)
這樣就不會出現這種問題了。這種用法大量見於巨集定義中含有的多行語句的時候。 在巨集定義中使用 do while 0
巨集定義中的do.while 0 如果你是c 程式設計師,我有理由相信你用過,或者接觸過,至少聽說過mfc,在mfc的afx.h檔案裡面,你會發現很多巨集定義都是用了do.while 0 或do.while false 比如說 define afxassume cond do while 0 粗看我...
巨集語句 do while 0
有時程式中重複出現某幾條語句,為了保證程式dry don t repeat yourself 需要將這幾條語句合併為一條語句.在c 中可以選擇用 inline,c語言沒有這個特性,但是可以用巨集實現.正確答案是用dowhile 0 實現,下面推理下為什麼這種方法最好吧.思路一 直接寫在一起 比如要將...
C語言巨集定義中使用do while 0 的理由
眾所周知,c語言支援巨集定義,並且功能強大。舉個例子 include define swap a,b int main 不過,巨集定義雖然強大,但是有時候卻難以駕馭它。上述巨集定義 define swap a,b 乍一看沒什麼問題,裡面使用了變數t,如果巨集定義外面也有變數叫t怎麼辦?這個不用擔心,...