:(__ASSERT_VOID_CAST (0))은 무엇입니까? C에서 assert.h를 파일에서
#define assert(expr) (__ASSERT_VOID_CAST (0))
내가 무엇을 궁금해 (__ASSERT_VOID_CAST (0))? 그 구현을 찾으려고하지만 어디서나 찾을 수 없습니다. assert.h
에서
:(__ASSERT_VOID_CAST (0))은 무엇입니까? C에서 assert.h를 파일에서
#define assert(expr) (__ASSERT_VOID_CAST (0))
내가 무엇을 궁금해 (__ASSERT_VOID_CAST (0))? 그 구현을 찾으려고하지만 어디서나 찾을 수 없습니다. assert.h
에서
, assert
의 정의 (리눅스, 쿠분투) 위의 몇 줄 :
#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast<void>
#else
# define __ASSERT_VOID_CAST (void)
#endif
음, __ASSERT_VOID_CAST
는 다른 매크로 어딘가에있을 것이고, '꺼져'하는 주장 할 때 뭔가에 확장됩니다
((void) 0)
과 같습니다. 이는 void
표현을 얻는 방법입니다. 이전의 구현에서는이 같은 표현으로 그것을 몸부림 쉼표 연산자를 사용 assert()
은 빈 문자열로 확장하지만, 보이드 표현하게됩니다 : 내 특정 시스템에 assert.h를에서
while(assert(n > 0), k/n > 10) { ... }
그 말한다 :
#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast<void>
#else
# define __ASSERT_VOID_CAST (void)
#endif
그래서 무효화하는 캐스팅, 그리고 이유는 NDEBUG가 true로 설정되어있을 때, unsed 값에 대한 경고를 피하기 위해 사용.
void cast가없는 간단한 0을 사용하지 않으시겠습니까? –
간단한 '0;'은 명령문으로 사용될 때'경고 : 효과없는 명령문 '을 제공합니다. 따라서'while' 부분에 대해서는 작동 할 수 있습니다. assert()를 문장으로 사용하는 것이 일반적이지 않습니다. –
@ 토마스 - 그렇습니다. 그러나'assert()'매크로는 void 표현식으로 정의된다는 것을 기억하십시오. 따라서 간단한 '0'으로 확장하는 것은 올바르지 않습니다. –