巨集函式以及do while 0 的巧妙用法

2021-09-25 06:20:47 字數 1438 閱讀 4736

巨集定義,編譯預處理命令,在編譯預處理時即進行簡單的字串替換。

巨集定義函式和使用者定義的函式在使用時有如下區別:

1、巨集函式會在編譯預處理時展開,只占用編譯時間,函式呼叫則會占用執行時間(分配單元、儲存現場、值傳遞、返回等),每次執行都需要載入,所以執行相對於巨集較慢。

2、在函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。

3、函式呼叫是在程式執行時處理的,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有返回值的概念。

4、對函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致,應進行型別轉換;而巨集不存在型別的問題,巨集名無型別,只是乙個符號代表,展開時代入指定的字元即可。巨集定義時,字串可以是任意型別的資料。

5、巨集函式的定義也有缺點,它容易會產生二義性。

dowhile(0)的巧妙用法

一:在巨集函式中使用dowhile(0),輔助定義複雜的巨集,避免引用的時候出錯

#define dosomething() \

do \

while(0) \

二:避免使用goto,實現對程式流程進行統一的控制。

有些函式中,在renturn之前我們經常會進行一些收尾的工作,比如free掉一塊函式開始malloc的記憶體,goto一直是乙個比較簡單的方法:

int foo()

dosomething...;

if(error)

dosomething...;

end:

free(ptr);

return 0;

}

由於goto不符合軟體工程的結構化,而且有可能使得**難懂,所以不提倡使用,那這個時候就可以用do{}while(0)來進行統一的管理:

int foo()

dosomething...;

if(error)

dosomething...;

}while(0);

free(ptr);

return 0;

}

這裡將函式主體使用do{}while(0)包含起來,使用break來代替goto,後續的處理工作在while之後,就能夠達到同樣的效果。

三:避免空巨集引起的warning

核心中由於不同架構的限制,很多時候會用到空巨集,在編譯的時候,空巨集會給出warning,為了避免這樣的warning,就可以使用do{}while(0)來定義空巨集

#define emptymicro do{}while(0)
四:定義乙個單獨的函式塊來實現複雜的操作:

當你的功能很複雜時,變數很多你又不願意增加乙個函式的時候,使用do{}while(0);將你的**寫在裡面,裡面可以定義變數而不用考慮變數名會同函式之前或者之後的重複。

巨集語句 do while 0

有時程式中重複出現某幾條語句,為了保證程式dry don t repeat yourself 需要將這幾條語句合併為一條語句.在c 中可以選擇用 inline,c語言沒有這個特性,但是可以用巨集實現.正確答案是用dowhile 0 實現,下面推理下為什麼這種方法最好吧.思路一 直接寫在一起 比如要將...

巨集定義中的do while 0

如果你是c 程式設計師,我有理由相信你用過,或者接觸過,至少聽說過mfc,在mfc的afx.h檔案裡面,你會發現很多巨集定義都是用了do.while 0 或do.while false 比如說 define afxassume cond do while 0 粗看我們就會覺得很奇怪,既然迴圈裡面只執...

C 巨集中的do while 0

如果你是 c 程式設計師,我有理由相信你用過,或者接觸過,至少聽說過 mfc,在mfc 的afx.h 檔案裡面,你會發現很多巨集定義都是用了 do.while 0 或do.while false 比如說 define afxassume cond do while 0 粗看我們就會覺得很奇怪,既然迴...