2013-06-28 94 views
3

什麼是定義宏這樣的原因:宏爲什麼這樣聲明?

#define test_errno(msg) do{if (errno) {perror(msg); exit(EXIT_FAILURE);}} while(0) 

我的意思是背後do{}while(0)的原因是什麼?當然,它只會做一次,零是恆定的,不能以某種方式改變爲非零,那麼爲什麼要使用這樣的構造?

回答

3

它允許之類的東西

if (condition) 
    test_errno(...); 

帶或不帶括號正常工作。

+1

缺少';'。宏認爲這個,它需要一個結束';',所以它看起來像一個真正的功能。 – vvy

2

在這種情況下沒有很好的理由。在類似的結構中,內部陳述有助於continuebreak做有用的事情。

#define test_errno(msg) do {if (cond1) break; \ 
          if (cond2) break; \ 
          if (cond3) break; \ 
       do_something_if_all_condtions_met();} while(0)