2009-11-08 2 views

답변

1

, assert의 정의 (리눅스, 쿠분투) 위의 몇 줄 :

#if defined __cplusplus && __GNUC_PREREQ (2,95) 
# define __ASSERT_VOID_CAST static_cast<void> 
#else 
# define __ASSERT_VOID_CAST (void) 
#endif 
4

음, __ASSERT_VOID_CAST는 다른 매크로 어딘가에있을 것이고, '꺼져'하는 주장 할 때 뭔가에 확장됩니다

((void) 0) 

과 같습니다. 이는 void 표현을 얻는 방법입니다. 이전의 구현에서는이 같은 표현으로 그것을 몸부림 쉼표 연산자를 사용 assert()은 빈 문자열로 확장하지만, 보이드 표현하게됩니다 : 내 특정 시스템에 assert.h를에서

while(assert(n > 0), k/n > 10) { ... } 
+0

void cast가없는 간단한 0을 사용하지 않으시겠습니까? –

+3

간단한 '0;'은 명령문으로 사용될 때'경고 : 효과없는 명령문 '을 제공합니다. 따라서'while' 부분에 대해서는 작동 할 수 있습니다. assert()를 문장으로 사용하는 것이 일반적이지 않습니다. –

+2

@ 토마스 - 그렇습니다. 그러나'assert()'매크로는 void 표현식으로 정의된다는 것을 기억하십시오. 따라서 간단한 '0'으로 확장하는 것은 올바르지 않습니다. –

2

그 말한다 :

#if defined __cplusplus && __GNUC_PREREQ (2,95) 
# define __ASSERT_VOID_CAST static_cast<void> 
#else 
# define __ASSERT_VOID_CAST (void) 
#endif 

그래서 무효화하는 캐스팅, 그리고 이유는 NDEBUG가 true로 설정되어있을 때, unsed 값에 대한 경고를 피하기 위해 사용.

관련 문제