2017-10-16 1 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'가 true로 평가되면,'ukd_assert (expr)'는 0으로 평가됩니다. 그렇지 않으면'Assert :: failedAssert()'를 호출하지만 0으로 평가됩니다. – scohe001

답변

0

: 수행합니다

나는 (? (어설 :: failedAssert을(), 0)) (무효) ((EXPR) 0) 무엇 확실하지 않다. 나는 그것이 failedAssert 함수를 호출하지만 많이는 없다는 것을 안다.

사실 3 진수 연산자는 두 피연산자가 같은 유형이어야합니다 (이 규칙에 대한 몇 가지 예외는 무시할 수 있습니다).
Assert::failedAssert()에 대한 선언을 제공하지 않았지만 반환 유형이 void 인 것으로 강력히 판단됩니다. 콤마 연산자는 식의 형식으로 int을 가능하게한다 :

(Assert::failedAssert(), 0) 

따라서 삼원 연산자의 두 식의 유형은 int이고 코드 컴파일 게.

첫 번째 (void)은 경고를 표시하지 않습니다.