2012-03-24 27 views
16

如果我有一個C++枚舉:如何更改枚舉(C++)使用的整數類型?

enum Foo 
{ 
    Bar, 
    Baz, 
    Bork, 
}; 

我如何告訴編譯器使用uint16_t實際存儲枚舉值?

編輯:GCC是否在C++ 11的實現中支持這個特性?

+1

@YochaiTimmer,標準改變了,鏈接上的主題沒有告訴'enum class' – Lol4t0 2012-03-24 17:10:13

+0

@YochaiTimmer:根本沒有。我想知道如果我可以改變枚舉來存儲它的內部值與'uint16_t',而不是它是否與'int'相同的大小。 – Linuxios 2012-03-24 17:14:34

回答

23

你不能在C++ 98/03中做到這一點。 C++ 11確實允許你這樣做,並沒有enum class每個人的方式抄小路都跟你:

enum EnumType : uint16_t 
{ 
    Bar, 
    Baz, 
    Bork, 
}; 

同樣,你不必使用enum class。不是說這是一個壞主意,但你不到。


GCC是否支持此功能,在其實施的C++ 11?

Which version of GCC?它看起來像GCC 4.4增加了這個功能,但你應該看看更新的版本,只是爲了穩定。

+0

我在想我自己。唯一的區別是'enum class'創建一個新的作用域,而'enum'不會。 – chris 2012-03-24 17:26:58

+3

@chris:不,在'enum class'和'enum'之間有幾處區別。兩者都創建範圍(上面的'Bar'可以通過'EnumType :: Bar'訪問),但只有'class'版本*強制你使用範圍枚舉。而且,'enum class'變量不會*將整數轉換爲枚舉類型。因此,您必須傳遞正確類型的實際枚舉數,或者您必須執行明確的投射。這增加了許多類型安全性。 – 2012-03-24 17:30:35

+0

哦,我從另一個問題得到了我的觀點:http://stackoverflow.com/questions/441552/scope-resolution-operator-on-enums-a-compiler-specific-extension至於你的第二點,我簡單從來沒有聽說過那個。感謝免費的知識:) – chris 2012-03-24 17:46:39

5

隨着c++11你現在有enum class,允許你設定明確的基本類型:

enum class Foo: uint16_t 
{ 
    Bar, 
    Baz, 
    Bork, 
}; 
13

在C++ 11,你可以這樣做:後來

enum class Foo : uint16_t 
{ 
    Bar, 
    Baz, 
    Bork, 
}; 

,你可以也know the underlying type of the enum爲:

#include <type_traits> 

std::underlying_type<Foo>::type v = 10; //v is uint16_t 
+3

+1用於添加'underlying_type'查詢。 – 2012-03-24 19:29:10

5

通過預C++ 2011可以通過使用合適的範圍內的值的強制的最小存儲:

enum foo { 
    v0 = 0, 
    vmax = 32767 
}; 

我認爲編譯器可以自由地選擇任一個符號或無符號的整數類型作爲基礎類型。上述範圍強制該表示至少使用short作爲其基礎整數。甚至更大可能會導致它使用long來代替。當然,這隻會強制最小範圍,編譯器可以自由選擇更大的範圍。此外,根據上述定義,不允許超出範圍[0, 32767]:如果您確實需要16位範圍(至少),則需要使用相應的值)。

+1

實際上,底層類型的大小也有限制。 [dcl.enum]/6 precises:除非枚舉器的值不適合int或unsigned int,否則基礎類型不應大於「int」。 – 2012-03-24 19:36:28