2013-06-28 3 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

В этом случае нет веской причины. В подобных конструкциях полезно, чтобы операторы внутри имели continue и break, чтобы делать полезные вещи.

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