2013-03-21 32 views
4

作爲一個C新手,我無法理解the following code爲什麼`做{...;出口(...); (0)`in C?

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ 
          } while (0) 

我收集的原因,這個功能是#define d是重寫現有的功能,但什麼是do ... while(0)循環的點與無條件exit()聲明?沒有循環結構寫這個是不可能的?

+0

不錯的問題,我想知道的一樣! +1 – 2013-03-21 14:37:16

+0

標題重複檢測器太糟糕了...... – l0b0 2013-03-21 14:42:10

回答

2

假設宏沒有do { ... } while(0)循環,只是裏面的2條語句。現在,如果我要寫

if(foo()) 
    errExit("foo!"); 

我的條件退出已成爲無條件退出。

7

很多重複在這裏我認爲。

do...while(0)竅門,您可以用在各種情況下errExit不破壞任何東西:

if(x) errExit(msg); 
else return 1; 

被翻譯成:

if(x) do { ...; ...; } while(0); 
else return 1; 

如果省略do...while(0)一部分,那麼你不能可靠地將例如分號。

+1

爲什麼簡單的大括號不能完成這項工作? – Joe 2013-03-21 14:37:38

+0

不錯! +1。這真的很聰明,很棘手。 – 2013-03-21 14:37:41

+1

嗯,所以整個想法是將結果代碼保留爲從周圍代碼中看到的單個語句?整齊! – l0b0 2013-03-21 14:39:13

1

do { ... } while(0)構造是常見的,並且通常被認爲是最佳實踐,用於多個語句的宏函數,比如這個。它允許使用作爲一個單一的聲明,所以沒有任何意外。