오늘 내가 cstdint 헤더 파일에 정의 된 일부 유형려고 사용하는 경우 적절한 경고를 제공하지 : std::uint16_t
, std::uint_least16_t
등등을 ..(C++ 11) g ++ cstdint 유형이 '잘못'
더 일반적인 플랫폼 특정 플랫폼과 달리 정확하게 또는 적어도 얼마나 큰지 알기 때문에 매우 유용하다고 생각합니다. int
, unsigned int
등등 .. 하지만 많은 오류가 발생할 수 있다고 생각되는 문제가 하나 있습니다 .
의 우리가이 코드를 가지고 있다고 가정 해 봅시다 :
#include <cstdint>
#include <iostream>
int main()
{
std::uint_fast16_t test = 0;
test = 65536;
std::cout << test;
return 0;
}
우리는 std::uint_fast16_t
가 최소 2 바이트 것을 알고있다.
uint_fast16_t
이 정확히 2 바이트 인 경우이 코드는 오버플로로 인해 경고를 표시합니다. 하지만 내 경우에 uint_fast16_t
은 8 바이트입니다 (이전에 확인).
그래서 내 경우에는이 코드가 제대로 컴파일되어 실행되고, 다른 경고는 발생합니다. 우리의 코드는 이식 가능하지 않습니다. 이것은 나를 위해 잘못되었습니다. 변수가 해당 데이터를 보유 할 수 있더라도 컴파일러는 최소한 경고를 주거나 더 큰 유형을 사용하도록 제안해야합니다. 맞습니까? 아니면 그 유형의 목적을 오해 했습니까?
나는이 플래그 ++ g을 사용하여 코드를 컴파일
-Wall -Werror -pedantic -std = C + +0
나는 다른 언어로 비슷한 것에 대해 불평하고있다. 기본 응답은 'uint_blahblah'는 별도의 형식이 아니라 내장 된 형식의 다른 이름이다. 이런 식으로 유형 검사가 필요한 경우 사용하지 마십시오. – Mehrdad