Почему макрос объявлен именно так?

В чем причина определения макроса таким образом:

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

Я имею в виду, в чем причина do{}while(0)? Конечно, это будет сделано только один раз, нуль постоянен, не может как-то измениться на ненулевое, так зачем использовать такую ​​конструкцию?


person 4pie0    schedule 28.06.2013    source источник


Ответы (2)


Это позволяет такие вещи, как

if (condition) 
   test_errno(...);

правильно работать с брекетами или без них.

person DrC    schedule 28.06.2013
comment
отсутствующий ;. макрос учитывает это, и ему нужно окончание ;, чтобы оно выглядело как настоящая функция. - person vvy; 28.06.2013

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

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