2012-02-14 37 views
4

現在我正在一個項目中廣泛使用64位無符號整數在代碼的很多部分。到目前爲止,我們只用gcc 4.6進行編譯,但現在我們正在將一些代碼移植到windows。這些未簽名的整數是64位寬是至關重要的。有人建議我們可以使用long long,但如果long long長度大於64bits,它並不好,我們實際上想要保證它會是64位,寫一些像static_assert(sizeof(long long) == 8)似乎有點代碼聞。C++跨平臺方式來定義64位無符號整數

什麼是最好的方式來定義類似uint64的東西,可以跨gcc和msvc編譯而不需要在任何地方都使用不同的代碼語法?

+5

爲什麼不直接使用'uint64_t'? – Fanael 2012-02-14 14:09:17

+0

會ifdef和typedef在一起做的伎倆? – 2012-02-14 14:12:36

+0

@DavidFeurle,這可能就足夠了,提出這個問題的目的是爲了感受最佳實踐在這裏。 – shuttle87 2012-02-14 14:16:24

回答

14

怎麼樣包括cstdint和使用std::uint64_t

+1

這只是在C++ 11。在此之前,大多數編譯器都有內在的工作。 – David 2012-02-14 14:35:00

+0

他已經在使用static_assert。 – kukyakya 2012-02-14 14:47:34

+0

@kukyakya,我現在正在gcc上做這件事,但我不知道MSVC是否存在靜態斷言,因爲我幾乎沒有經歷過這種情況。 – shuttle87 2012-02-14 15:12:46

3

可以使用升壓:

的類型定義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

有趣的建議,因爲我們使用boost很多,如果'cstdint'不可用,這可能會做這個技巧。 – shuttle87 2012-02-14 17:13:06

0

在Windows下你可以使用__int64unsigned __int64,或類型定義:UINT64INT64

this

但是,我f代碼可移植性值得關注,請使用其他人所建議的標準typedefs。

1

這是我做的:

#ifndef u64 
#ifdef WIN32 
typedef unsigned __int64 u64; 
#else // !WIN32 
typedef unsigned long long u64; 
#endif 
#endif