2009-09-24 320 views
26

在C99中,我包含了stdint.h,它給了我UINT32_MAX以及uint32_t。但是,在C++中,UINT32_MAX被定義。在包含stdint.h之前,我可以定義__STDC_LIMIT_MACROS,但是如果有人在包含stdint.h之後包含我的頭文件,則這種方法無效。什麼是UINT32_MAX的C++等價物?

所以在C++中,找出uint32_t中可表示的最大值的標準方法是什麼?

+7

死靈側面說明:'#包括'在C++ – AJG85 2011-06-09 16:00:50

+0

@ AJG85有正確的答案。 – 2014-08-26 15:31:21

回答

48

嗯,我不知道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是上面比這個代碼應開箱

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

或者'uint32_t'是否是上述之一的'typedef'? – 2013-06-11 01:56:38

+0

我當然希望它是一個typedef。如果你的工具使用'#define',我質疑它們的質量。 – John 2013-06-11 02:18:02

+0

爲了避免與std :: min()和std :: max()混淆numeric_limits :: min(),numeric_limits :: max(),我必須將它括在括號中,如下所示:(std :: numeric_limits ::最大)(); – 2013-11-07 16:20:47

18

std::numeric_limits<T>::max()定義了類型爲T的最大值。

20

井之一的#define,uint32_t的永遠是32位的,始終是無符號的,所以你可以安全手動定義它:

#define UINT32_MAX (0xffffffff) 

你也可以做

#define UINT32_MAX ((uint32_t)-1) 
+20

當我們擁有完全有效的標準C++構造時,我們不需要求助於這種構造,它只使用3倍的字符。 – John 2013-06-11 02:19:34

+1

@約翰:這是完美的標準和便攜式。 – 2013-11-06 23:17:51

+0

標準庫可能不總是可用的 - 對於內核模塊代碼例如... – mtahmed 2014-12-08 07:09:33

1

您可以消除通過改變你的構建過程中的#include治安問題來定義編譯器命令行而不是在__STDC_LIMIT_MACROS符號:

cxx -D__STDC_LIMIT_MACROS ... 

當然,你仍然有麻煩,如果一個頭#undef這是這個符號。

此外,您正在使用的標準庫實現的作者可能沒有打算讓用戶設置該特定符號;可能會有一個編譯器標誌或用戶打算用來在C++中啓用C99類型的不同符號。

1

我不能評論,所以這裏是我對Glen與Lior Kogan的回答的投入。

如果你使用的是靜態變量,你會遇到這樣的問題,如果你在一個類中爲一個常量賦值給numeric_limits :: max(),那麼這個值實際上會因爲初始化的順序而被設置爲零(參見這篇文章zero initialization and static initialization of local scope static variable

所以在那種情況下,它只會使用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) 
相關問題