2015-06-01 3 views
2

Чтение кода хрома, нашел полезный макрос для обработки EINTR errno системных вызовов в системах, совместимых с POSIX. Вот код (базовый/POSIX/eintr_wrapper.h):Заявление в макросе C++

#define HANDLE_EINTR(x) ({ \ 
    decltype(x) eintr_wrapper_result; \ 
    do { \ 
    eintr_wrapper_result = (x); \ 
    } while (eintr_wrapper_result == -1 && errno == EINTR); \ 
    eintr_wrapper_result; \ 
}) 

Вопрос заключается в том, что роль последнего заявления в макро eintr_wrapper_result;? Если мы используем запятые вместо точек с запятой - будет ясно - вернуть результат последней операции (оператор запятой). Но какова цель в этом случае?

+1

См. Возможный дубликат: [Являются ли компромиссные утверждения (блоки), окруженные выражениями parens в ANSI C?] (Http://stackoverflow.com/q/1238016/1708801) ... поскольку мой ответ на этот вопрос говорит: * Последняя вещь в составном выражении должна быть выражением, за которым следует точка с запятой; значение этого подвыражения служит значением всей конструкции. * –

ответ

7

Этот макрос использует расширение GCC Statement-Expressions. Последнее выражение во внутреннем блоке служит значением для целого, как только оно было выполнено, подобно оператору запятой.

+0

Для интереса, почему бы просто не использовать запятую? – simonwo

+2

@simonwo Потому что 'do {} while()' не является выражением и, следовательно, не может быть операндом оператора запятой. – Quentin

Смежные вопросы