2012-05-29 8 views
3

오늘 내가 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

+2

나는 다른 언어로 비슷한 것에 대해 불평하고있다. 기본 응답은 'uint_blahblah'는 별도의 형식이 아니라 내장 된 형식의 다른 이름이다. 이런 식으로 유형 검사가 필요한 경우 사용하지 마십시오. – Mehrdad

답변

4

컴파일러 이러한 유형의 typedef이기 때문에, 다른 경고를 제공 할 수 없습니다 동의어 인 것과 똑같이 취급됩니다. 그것이 C++가 작동하는 방식입니다. 이 유형이 보유 할 수있는 최대 값을 알려주기 위해 UINT_FAST16_MAX 및 가능하게는 std::numeric_limits<std::uint_fast16_t>::max()이 있습니다. 그 정보를 사용하는 것은 당신의 직업입니다.

stdint로 정의 된 대부분의 유형은 실제로 선택 사항이므로 실제로 사용하고 있는지 여부를 확인하지 않고 코드를 변환 할 수 없게 만듭니다.

+0

컴파일러와 라이브러리를 조심스럽게 조정하면 컴파일러는 라이브러리가 typedef 할 수있는 내장 유형을 제공 할 수 있습니다. –

+0

나는 아마도 그 한계를 사용하여 그 유형을 확장하는 내 자신의 클래스를 작성하려고한다. uint_fast 및 uint_least 유형을 사용하는 한 내 코드는 어쨌든 이식 가능해야합니다. 맞습니까? – Gaudo