문제

C99에는 stdint.h를 포함하며 UINT32_T뿐만 아니라 UINT32_MAX를 제공합니다. 그러나 C ++에서는 UINT32_MAX가 정의됩니다. stdint.h를 포함시키기 전에 __stdc_limit_macros를 정의 할 수 있지만, 누군가가 이미 stdint.h 자체를 포함한 후 내 헤더를 포함하는 경우에는 작동하지 않습니다.

C ++에서 UINT32_T에서 표현할 수있는 최대 값을 찾는 표준 방법은 무엇입니까?

도움이 되었습니까?

해결책

글쎄, 나는 모른다 uint32_t 그러나 기본 유형의 경우 (bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double) 사용해야합니다 numeric_limits 템플릿을 통해 #include <limits>.

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;

만약에 uint32_t a #define 이 코드 중 하나 중 하나는 상자에서 작동해야합니다.

    cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;

다른 팁

std::numeric_limits<T>::max() 유형의 최대 값을 정의합니다 T.

글쎄, UINT32_T는 항상 32 비트가되며 항상 서명되지 않으므로 수동으로 안전하게 정의 할 수 있습니다.

#define UINT32_MAX  (0xffffffff)

당신은 또한 할 수 있습니다

#define UINT32_MAX  ((uint32_t)-1)

당신은 그것을 제거 할 수 있습니다 #include 빌드 프로세스를 변경하여 __STDC_LIMIT_MACROS 대신 컴파일러 명령 줄의 기호 :

cxx -D__STDC_LIMIT_MACROS ...

물론 헤더는 여전히 문제가있을 것입니다. #undef이 상징.

또한 사용중인 표준 라이브러리 구현의 저자는 사용자가 해당 특정 기호를 설정하도록 의도하지 않을 수 있습니다. C ++에서 C99 유형을 활성화하기 위해 사용자가 사용하는 컴파일러 플래그 또는 다른 기호가있을 수 있습니다.

나는 언급 할 수 없으므로 여기에 Glen vs Lior Kogan의 답변에 대한 나의 의견이 있습니다.

정적 변수를 사용하는 경우 클래스 내에서 일정한 값을 numeric_limits에 할당하면 초기화 순서로 인해 값이 실제로 0으로 설정됩니다 (이 게시물 참조. 로컬 범위 정적 변수의 초기화 제로 및 정적 초기화)

따라서이 경우 Lior Kogan의 답변을 사용 하여만 작동합니다.

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX  ((uint32_t)-1)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top