C語言巨集定義中使用do while 0 的理由

2021-06-22 13:31:35 字數 1163 閱讀 8430

眾所周知,c語言支援巨集定義,並且功能強大。舉個例子:

#include #define swap(a,b)	

int main()

不過,巨集定義雖然強大,但是有時候卻難以駕馭它。

上述巨集定義

#define swap(a,b)

乍一看沒什麼問題,裡面使用了變數t,如果巨集定義外面也有變數叫t怎麼辦?這個不用擔心,因為我們使用了花括號,這個t是不會和外界相互影響的。確實很完美。不過,你是否發現這樣的問題?

這個**:

#include #define swap(a,b)	

int main()

是無法正常編譯通過的。什麼?很簡單,加入編譯器將swap這個巨集替換為最終的**,那麼,就是這樣:

if (x > y)

; else

swap(y, z);

注意花括號後面的那個分號,這使得編譯器認為if就這樣結束了,而後面的else也就沒有與之匹配的if了。

那,怎麼辦呢?這不是我們想要的結果。如果我們在使用swap巨集的時候不在後面加上分號不就行了嗎?像這樣:

if (x > y)

swap(x, y)

else

swap(y, z);

注意第乙個swap,後面沒有加上分號,這樣確實編譯的錯誤也就沒有了,但是,這也不是乙個好主意,畢竟在c語言中突然冒出來一句末尾沒有分號的語句會讓人感到很奇怪,而且這不利於**的維護(使用這個巨集的人都得注意這個巨集存在的問題,就是末尾不要加分號才能保證不出錯)。

#include #define swap(a,b)   dowhile(0)

int main()

在巨集的前後分別使用do和while(0)圍起來(沒有分號),這樣,我們直接在if下面使用也不會出現問題了。這樣定義巨集,它才真正能夠被看做乙個單獨的表示式使用,加上末尾分號才真正等價於一條單獨的語句。

在linux源**中,這樣的巨集定義十分常見,就是為了避免上述的一些問題(以及一些其它筆者暫未涉及到的問題)。當然,也不排除有其它的解決方法,也歡迎讀者指出。

謝謝。

C語言巨集定義的使用

寫好c語言,漂亮的巨集定義很重要,使用巨集定義可以防止出錯,提高可移植性,可讀性,方便性 等等。下面列舉一些成熟軟體中常用得巨集定義。1,防止乙個標頭檔案被重複包含 ifndef comdef h define comdef h 標頭檔案內容 endif 2,重新定義一些型別,防止由於各種平台和編譯...

C語言巨集定義 基本使用

2.巨集展開過程 巨集定義分為2類,不帶引數的巨集定義 和 帶引數的巨集定義 形式 使用乙個指定的識別符號來代表乙個字串 define 識別符號 字串例如 define pi 3.14159265作用 程式中但凡使用到pi的地方全部都會用3.14159265來替換,主要用途使用乙個簡單識別符號來代替...

C語言巨集定義

c語言有很多預處理命令,如包含命令 include,巨集定義命令 define。預處理命令在程式編譯之前被編譯器處理,而巨集定義也在此時被替換。或c 語言源程式中允許用乙個識別符號來表示乙個字串,稱為 巨集 被定義為 巨集 的識別符號稱為 巨集名 在編譯預處理時,對程式中所有出現的 巨集名 都用巨集...