2015-06-01 36 views
2

讀取鉻代碼,發現有用的宏,用於在符合POSIX的系統上處理系統調用的EINTR errno。 這裏是代碼(基地/ 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

查看可能的重複:[在ANSI C中包含parens表達式的複合語句(塊)?](http://stackoverflow.com/q/1238016/1708801)...因爲我對這個問題的回答是: *複合語句中的最後一項應該是一個表達式,後跟分號;這個子表達式的值作爲整個構造的價值。* –

回答

7

該宏使用Statement-Expressions GCC擴展。內部塊中的最後一個表達式用作整體的值,一旦它被執行,就像逗號運算符一樣。

+0

感興趣的是,爲什麼不使用逗號運算符? – simonwo

+2

@simonwo由於'do {} while()'不是表達式,因此不能是逗號運算符的操作數。 – Quentin