2010-08-14 5 views
5

최근에 두 종류의 크기가 같은지 확인하기 위해 C++에서 컴파일 타임 어설 션이 필요했습니다.C++에서 컴파일 타임 어설 션?

#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 

내가 지금처럼 사용할 :

나는 (리눅스 커널에서 온 것으로 언급) 웹에 다음 매크로 발견

X_ASSERT(sizeof(Botan::byte) != sizeof(char)); 

이 날 호기심 도착을 -이 비록 으로 작동합니다. 더 깨끗한 방법이 있습니까? (분명히 한 가지 이상의 방법이 있습니다.) 특정 방법에는 장단점이 있습니까?

+0

감사합니다. C++ 0x가'static_assert'를 얻는 것을보고 기쁩니다. 전에 그것에 대해 읽은 것을 기억하지 못합니다. ;) –

답변

6

Boost StaticAssert을 살펴볼 수 있습니다. 내부는 정확히 깨끗하지는 않지만 (적어도 내가 본 마지막 시간은 아니 었음) 적어도 훨씬 더 알아볼 수 있기 때문에 대부분의 사람들은 그것이 의미하는 바를 알고 있습니다. 또한 메모리가 작동하면보다 의미있는 오류 메시지를 생성하기 위해 약간의 노력을 기울입니다.

+3

나는 실제로 ['BOOST_MPL_ASSERT_MSG'] (http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/refmanual/assert-msg.html)를 선호합니다. – GManNickG

10

C++ 0x에는 컴파일 타임 표명을 생성하는 표준 방법을 제공하는 새로운 언어 기능인 static_assert이 있습니다. g ++ 4.3 (이상) 및 인텔 C++ 11.0 할 예를 들어, ++ 2010

static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size"); 

비주얼 C는 static_assert을 지원합니다.

0

이 우수한 #error 처리기 지시문 (그것에 대해 좋은 에세이 here 참조)가,하지만 난 그게에서 사용되는 대조적으로 #if 내에서 할 필요가 믿는 "독립"당신의 예를 사용한다.

+3

'# error'는 그것이 전처리 지시문이고 소스가 파싱되기 전에 평가된다는 단점이 있으며,'# if' 지시문에서'sizeof' 또는 비 매크로 상수와 같은 것을 사용할 수 없습니다. –

1

일부 다른 흥미로운 옵션은 현재 위치 : 저자로 http://www.jaggersoft.com/pubs/CVu11_3.html

깔끔한 읽기 컴파일시 주장으로 활용할 수있는 구문을 찾기 위해 C (안 C++) 스펙을 안내합니다.