2012-02-14 2 views
4

지금 코드의 많은 부분에서 64 비트 부호없는 정수를 광범위하게 사용하는 프로젝트를 진행하고 있습니다. 지금까지는 gcc 4.6으로만 컴파일을했지만 지금은 코드를 윈도우로 이식하고 있습니다. 이러한 서명되지 않은 int 값은 64 비트입니다. 우리는 오래 동안 사용할 수 있다고 제안되었지만, 오랫동안 64 비트 이상이되면 64 비트가 될 것이라는 보증을하고 싶습니다. static_assert(sizeof(long long) == 8)은 약간의 코드처럼 보입니다. 냄새.C++ 교차 플랫폼에서 64 비트 부호없는 정수를 정의하는 방법

어디서나 다른 코드 구문을 사용하지 않고도 gcc와 msvc에서 컴파일 할 uint64와 같은 것을 정의하는 가장 좋은 방법은 무엇입니까?

+5

은 왜 그냥'uint64_t'를 사용할 수 있습니까? – Fanael

+0

ifdef와 typedef가 함께 트릭을 수행합니까? –

+0

@DavidFeurle,이 질문을하는 목적은 모범 사례가 무엇인지에 대한 느낌을 얻는 것이 었습니다. – shuttle87

답변

14

cstdint을 포함하고 std::uint64_t을 사용하면 어떨까요?

+1

이것은 C++ 11에만 해당됩니다. 그 전에는 대부분의 컴파일러가 작업을 수행하는 고유 한 기능을 가지고있었습니다. – David

+0

그는 이미 static_assert를 사용하고 있습니다. – kukyakya

+0

@kukyakya, 현재 gcc에서 그렇게하고 있습니다.하지만 MSVC에 대한 정적 인 주장이 있는지에 대해서는 잘 모릅니다. 경험이 거의 없기 때문입니다. – shuttle87

3

당신은 부스트 ​​사용할 수 있습니다

typedef입니다의 INT 번호의 _t, #와 폭으로 대체 정확히 # 비트의 서명 정수 유형을 지정; 예를 들어, int8_t는 부호가있는 정수 유형 인 8 비트 을 나타냅니다. 마찬가지로 typedef uint # _t는 부호없는 정수 유형의 # 비트를 지정합니다.

참조 : http://www.boost.org/doc/libs/1_48_0/libs/integer/doc/html/boost_integer/cstdint.html

특히이 헤더는 : http://www.boost.org/doc/libs/1_48_0/boost/cstdint.hpp

+0

재미있는 제안, 우리가 많이 사용하기 때문에 이것은 'cstdint'를 사용할 수 없다면이 트릭을 할 수 있습니다. – shuttle87

0

Windows에서 당신이 __int64, unsigned __int64 또는 형식 정의를 사용할 수 있습니다 UINT64INT64

this

에서

하지만 그렇습니다. f 코드 이동성은 다른 사람들이 제안한 것처럼 표준 typedef를 사용하는 것이 중요합니다.

1

이 내가 할 것입니다 :

#ifndef u64 
#ifdef WIN32 
typedef unsigned __int64 u64; 
#else // !WIN32 
typedef unsigned long long u64; 
#endif 
#endif 
관련 문제