C++에서 이와 같은 작업을 수행 할 수있는 방법이 있습니까? sizeof cant가 사용 된 것으로 보입니다.C++ 매크로에서 유형의 크기를 얻는 것은
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
C++에서 이와 같은 작업을 수행 할 수있는 방법이 있습니까? sizeof cant가 사용 된 것으로 보입니다.C++ 매크로에서 유형의 크기를 얻는 것은
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
에서 WCHAR_MIN
및 WCHAR_MAX
매크로를 가지고있다.
이 아니요,이 모든 매크로 확장 (# ... 일)이 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 만 액세스 및 사용 것들.
현재, 전처리자가 때때로 존재하지 않습니다. –
@Cole Johnson : 전처리기를 완전히 생략 한 사람은 본 적이 없습니다. 전처리 기가없는 C 또는 C++ 컴파일러에 대해 알고 있습니까? – mmmmmmmm
내가 아는 것은 아닙니다.나는'#pragma'와 같은 것을 언급하고있었습니다. –
sizeof()는
런타임
컴파일 타임 기능입니다. 전 처리기 지시어에서 호출 할 수 없습니다.
전처리 중에 wchar_t의 크기를 확인할 수 있다고 생각하지 않습니다.
(편집 2 참조)
편집 : 의견에서 지적한 바와 같이,는 sizeof()는 컴파일시에 계산 대부분입니다. C99에서 it can be used at runtime for arrays.
편집 2 :이 thread에 설명 된 기술을 사용하여 빌드 할 때 assert를 할 수 있습니다.
전처리 기는 유형, 심지어 내장 된 것조차 모른 채 작동합니다.
아직, static_assert와 같은 기능을 사용하여 검사를 수행 할 수 있습니다 (예 : 부스트가 하나 있는데, C++ 0X는이를 가질 것입니다).
편집 : C99 및 C++ 0X도 내가 BOOST_STATIC_ASSERT 같은 것들이 도움이 될 생각 <stdint.h>
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];
C_ASSERT를 사용하여 기본적으로 원하는 오류 메시지를 표시하지 않으시겠습니까?
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
매크로 조건 내에서 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)
내.
질문으로 인해 빌드 타임이 가능하다는 것을 배웠습니다. 이 기술은이 스레드에서 자세히 논의됩니다. http://stackoverflow.com/questions/174356/ways-to-assert-expressions-at-build-time-in-c – nagul