C ++에서 고정 너비 정수는 optional 으로 정의되어 있지만 실제로 정의되어 있는지 확인하는 권장 방법을 찾지 못하는 것 같습니다.
고정 너비 정수를 사용할 수 있는지 확인하는 이식 가능한 방법은 무엇입니까?
cpp
파일 을 컴파일 하여 컴파일이 실패하는지 여부에 따라 정의 할 수있는 매크로가 설정되어 있는지에 따라 특정 언어 기능을 테스트 할 수 있습니다.
AC_TYPE_INT8_T
등
C ++에서 고정 너비 정수는 optional 으로 정의되어 있지만 실제로 정의되어 있는지 확인하는 권장 방법을 찾지 못하는 것 같습니다.
고정 너비 정수를 사용할 수 있는지 확인하는 이식 가능한 방법은 무엇입니까?
cpp
파일 을 컴파일 하여 컴파일이 실패하는지 여부에 따라 정의 할 수있는 매크로가 설정되어 있는지에 따라 특정 언어 기능을 테스트 할 수 있습니다.
AC_TYPE_INT8_T
등
답변:
고정 너비 정수 유형이 제공되는지 판별하기 위해 해당 매크로 [U]INT*_MAX
또는 [U]INT*_MIN
매크로가 정의되어 있는지 확인할 수 있습니다 .
// may be necessary for your C++ implementation
#define __STDC_LIMIT_MACROS
#include <cstdint>
#ifdef INT32_MAX
// int32_t must be available to get here
int32_t some32bitIntVariable;
#endif
당 7.20 정수 유형<stdint.h>
의 C11 표준의 제 4 항 (굵게 표시된 부분을 참고)
구현에서 제공하는 여기에 설명 된 각 유형에 대해
<stdint.h>
해당typedef
이름을 선언 하고 관련 매크로를 정의해야합니다 . 반대로, 구현에서 제공하지 않는 여기에 설명 된 각 유형에 대해<stdint.h>
해당typedef
이름을 선언 하거나 연관된 매크로를 정의하지 않아야합니다 .
C ++는를 통해 C 구현을 상속합니다 <cstdint>
. 자세한 내용은 <cstdint>
vs<stdint.h>
를 참조 하십시오. 또한 무엇 __STDC_LIMIT_MACROS
을 __STDC_CONSTANT_MACROS
의미합니까? 에 대한 자세한 내용 __STDC_LIMIT_MACROS
.
따라서,이 경우에 int32_t
사용할 수 있으며, INT32_MAX
그리고 INT32_MIN
있어야 #define
D '. 반대로, int32_t
사용할 수없는 경우 'd' INT32_MAX
도 INT32_MIN
허용 되지 않습니다 #define
.
참고하지만, @NicolBolas는 다른 답변에 명시된 바와 같이 실제로 확인하기 위해, 필요하지 않을 수도있다.
[U]INT*_C
대신에 최소 및 최대 매크로
광범위하게 말하면 ... 당신은하지 않습니다.
고정 크기 정수 유형을 사용해야하는 경우 해당 유형의 특정 크기 를 명시 적으로 필요로 합니다. 즉, 해당 크기의 정수를 얻을 수 없으면 코드가 작동하지 않습니다. 따라서 당신은 그것들을 사용해야합니다. 누군가가 위의 유형이없는 컴파일러에서 코드를 사용하면 코드가 컴파일되지 않습니다. 컴파일하면 코드가 작동하지 않았기 때문에 괜찮습니다.
실제로 고정 크기 정수 가 필요 하지 않지만 다른 이유로 단순히 정수를 원하면 int_least_*
유형 을 사용하십시오 . 구현이 정확히 그 크기를 줄 수 있다면, least_*
타입은 그 크기를 가질 것입니다.
uint8_t
)인지 확인해야하지만이 코드는 바이트가 8 비트가 아닌 플랫폼에서 실행되어야했습니다 ( 오래된 C ++ 구현, 왜 uint8_t
사용할 수없는 유일한 이유 입니까?) 즉, 이전 버전과의 호환성을 벗어난 이유는 무엇입니까?
uint8_t
이었다 훨씬 이전 임시 (그리고 자주 고장) 방식에 비해 선명.
O(1)
대 O(n)
. 사람들이 예를 들어 같은 이유 uint16_t
. 당신은 "uint32_t를 사용하지 않고 스스로 캐스팅하지 않겠습니까?"라고 묻습니다.
uint16_t
. 내 이유는 내 컴퓨터에 엔디안을 사용하여 부호없는 정수 이진 형식으로 16 비트의 데이터를 정확하게 얻을 것으로 예상되는 장치 / 형식 / 등과 통신하고 있으며 정확히 말하면 효과적으로 의사 소통하는 것이 훨씬 더 어렵습니다. 내 프로그램 (그리고 내가 사용하는 API)은 기본적으로 그것을 제공하지 않는 컴퓨터에서 작동 할 수 없습니다 .
#if defined(INT8_MIN)