2009-08-02 2 views
7

C++에서 이와 같은 작업을 수행 할 수있는 방법이 있습니까? sizeof cant가 사용 된 것으로 보입니다.C++ 매크로에서 유형의 크기를 얻는 것은

#if sizeof(wchar_t) != 2 
#error "wchar_t is expected to be a 16 bit type." 
#endif 
+0

질문으로 인해 빌드 타임이 가능하다는 것을 배웠습니다. 이 기술은이 스레드에서 자세히 논의됩니다. http://stackoverflow.com/questions/174356/ways-to-assert-expressions-at-build-time-in-c – nagul

답변

4

에서 WCHAR_MINWCHAR_MAX 매크로를 가지고있다.

14

이 아니요,이 모든 매크로 확장 (# ... 일)이 C++ 코드의 종류에 대해 아무것도 모르는하는 전처리 단계에서 수행되기 때문에 수행 할 수 없습니다하지 않아도 수 언어에 관해 무엇인가를 알아야합니다! 그냥 ... # 가지만 확대/확인하지만 다른 것은 없습니다!

예를 들어, 다른 일반적인 오류가 있습니다

enum XY 
{ 
    MY_CONST = 7, 
}; 

#if MY_CONST == 7 
    // This code will NEVER be compiled because the pre-processor does not know anything about your enum! 
#endif // 

할 수 있습니다 컴파일러 또는 #DEFINE를 통한 명령 행 옵션을 통해 정의의 #if 만 액세스 및 사용 것들.

+0

현재, 전처리자가 때때로 존재하지 않습니다. –

+0

@Cole Johnson : 전처리기를 완전히 생략 한 사람은 본 적이 없습니다. 전처리 기가없는 C 또는 C++ 컴파일러에 대해 알고 있습니까? – mmmmmmmm

+0

내가 아는 것은 아닙니다.나는'#pragma'와 같은 것을 언급하고있었습니다. –

3

sizeof()는 런타임 컴파일 타임 기능입니다. 전 처리기 지시어에서 호출 할 수 없습니다. 전처리 중에 wchar_t의 크기를 확인할 수 있다고 생각하지 않습니다. (편집 2 참조)

편집 : 의견에서 지적한 바와 같이,는 sizeof()는 컴파일시에 계산 대부분입니다. C99에서 it can be used at runtime for arrays.

편집 2 :이 thread에 설명 된 기술을 사용하여 빌드 할 때 assert를 할 수 있습니다.

+7

sizeof()는 런타임 함수가 아닙니다. 이것은 컴파일 타임에 컴파일러가 평가하는 컴파일 타임 식입니다 (그러나 사전 처리기 시간 이후). – mmmmmmmm

+0

감사합니다. 그 사실을 인식하지 못했습니다. 그에 따라 업데이트되었습니다. – nagul

+1

@nagul : 좋아, 아마도 항상 컴파일 타임식이 아닌 :-) – mmmmmmmm

7

전처리 기는 유형, 심지어 내장 된 것조차 모른 채 작동합니다.

아직, static_assert와 같은 기능을 사용하여 검사를 수행 할 수 있습니다 (예 : 부스트가 하나 있는데, C++ 0X는이를 가질 것입니다).

편집 : C99 및 C++ 0X도 내가 BOOST_STATIC_ASSERT 같은 것들이 도움이 될 생각 <stdint.h>

1
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1]; 
3

C_ASSERT를 사용하여 기본적으로 원하는 오류 메시지를 표시하지 않으시겠습니까?

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] 
0

매크로 조건 내에서 sizeof를 효과적으로 사용할 수있는 매크로를 개발했습니다. 그들은 here (MIT 면허)을 업로드 한 헤더 파일에 있습니다.

그것은이 같은 코드를 허용합니다

#include <iostream> 
#include "SIZEOF_definitions.h" 

//You can also use SIZEOF_UINT in place of SIZEOF(unsigned, int) 
// and UINT_BIT in place of SIZEOF_BIT(unsigned, int) 
#if SIZEOF(unsigned, int) == 4 
int func() { return SIZEOF_BIT(unsigned, int); } 
#elif SIZEOF(unsigned, int) == 8 
int func() { return 2 * SIZEOF_BIT(unsigned, int); } 
#endif 

int main(int argc, char** argv) { 
    std::cout SIZEOF(unsigned, long, int) << " chars, #bits = " << SIZEOF_BIT(unsigned, long, int) << '\n' 
     << SIZEOF(unsigned, int)  << " chars, #bits = " << SIZEOF_BIT(unsigned, int)  << '\n' 
     << SIZEOF(int)     << " chars, #bits = " << SIZEOF_BIT(int)     << '\n'; 
    std::cout << func() << std::endl; 
    return 0; 
} 

참고 쉼표를 SIZEOF(unsigned, long, int) 내.

관련 문제