2017-10-16 130 views
0

我想了解一些C++代碼,這段代碼讓我感到困惑。關於特定表達式在C/C++宏定義的問題

#ifndef NDEBUG 
#define ukd_assert(expr) \ 
((void)((expr) ? 0 : (Assert::failedAssert(), 0))) 

#else // NDEBUG 
#define INSTANTIATE_ASSERT(fp) 
#define ukd_assert(expr) ((void)0) 
#endif // NDEBUG 

誰能告訴我如何解釋這個?

+1

哪個部分特別令人困惑? – chris

+0

我不確定什麼((void)((expr)?0:(Assert :: failedAssert(),0)))。我知道它調用函數failedAssert,但沒有其他的。 – ANovice

+0

它使用三元運算符。如果'expr'的計算結果爲真,'ukd_assert(expr)'將計算爲0.否則,它將調用'Assert :: failedAssert()',但仍評估爲0。 – scohe001

回答

0

由於從評論的問題:

我不知道((無效)((表達式)?0:(斷言:: failedAssert(),0)))一樣。我知道它調用函數failedAssert,但沒有其他的。

事實是,三元操作符要求兩個操作數是相同類型的(您可以自由地忽略該規則的少數例外情況)。
即使您沒有提供Assert::failedAssert()的聲明,但我強烈懷疑其返回類型爲void。逗號運算符使得能夠具有int作爲表達式的類型:

(Assert::failedAssert(), 0) 

因此類型三元運算符的兩個表達式的是int和代碼編譯愉快。

第一個(void)反而只是用來壓制警告。