do while 0 用法分析

2021-08-01 01:28:43 字數 1053 閱讀 3931

在許多c/c++巨集定義中我們會看到巨集**包含在do while迴圈或者if else語句裡,例如:

#define m(x) do while (0)

#define m(x) if (1) else

那麼這種用法有什麼好處呢?這種用法最大的好處是增強巨集定義**的魯棒性,儘管使得程式稍稍變得更加複雜。為了加快專案開發進度,現在乙個工程的開發越來越需要相互合作與溝通交流,不管是利用別人的**庫還是寫一些標頭檔案供別人呼叫,都需要程式能夠按照程式設計者的意圖執行。但是對於這裡提到的巨集定義來說,你並不知道別人會怎麼使用你的巨集,如果定義不合理就會出現一些問題,例如下面這個巨集定義:

#define m(x) f(x); g(x)

如果你這樣使用這個巨集:

if (condition)

m(x);

else

f();

巨集展開時會變成:

if (condition)

f(x); g(x);

else

f();

這樣就會出現語法錯誤,因為else找不到對應的if語句。如果給巨集新增乙個大括號,則變成:

if (condition)

;else

f();

這樣也會出現語法錯誤,因為大括號後多了分號。針對這個問題,可以利用do while(0)或者if else來解決,例如:

#define m(x)  do while (0)

或者:  #define m(x)  if (1) else

這樣呼叫後巨集展開成:

if (condition) 

do while (0);

else

f();

或者:  if (condition) 

if (1) else;

else

f();

這種方式利用了分號在**中的作用,可以有效克服c預處理器的一些缺點。有些程式設計指南告訴你要減少使用預處理器,這裡提到的一點就是他們擔心的乙個原因。當然對於這種情況,你也可以把m(x)單獨定義為乙個函式,而不是乙個巨集。最後需要注意的一點是巨集定義要寫在一行,跨行需要加反斜槓'\'。

do while 0 的意義和用法

首先明確的是do while迴圈中,無論判斷條件是否滿足,do while 迴圈體內的 至少會執行一次。下文 linux核心和其他一些開源的 中,經常會遇到這樣的 dowhile 0 這樣的 一看就不是乙個迴圈,do.while表面上在這裡一點意義都沒有,那麼為什麼要這麼用呢?實際上,dowhile...

do while 0 的意義和用法

linux核心和其他一些開源的 中,經常會遇到這樣的 do while 0 這樣的 一看就不是乙個迴圈,do.while表面上在這裡一點意義都沒有,那麼為什麼要這麼用呢?實際上,dowhile 0 的作用遠大於美化你的 查了些資料,總結起來這樣寫主要有以下幾點好處 1 輔助定義複雜的巨集,避免引用的...

do while 0 的意義和用法

linux核心和其他一些開源的 中,經常會遇到這樣的 do while 0 這樣的 一看就不是乙個迴圈,do.while表面上在這裡一點意義都沒有,那麼為什麼要這麼用呢?實際上,dowhile 0 的作用遠大於美化你的 查了些資料,總結起來這樣寫主要有以下幾點好處 1 輔助定義複雜的巨集,避免引用的...