2016-05-18 36 views
6

2011年より前のC++では、列挙型はバイトからロングまでの任意のサイズにすることができます。しかし、実際には、ほとんどのコンパイラが4バイトのintを作るようです。実際の列挙サイズ*

実際には、現在のコンパイラはint型にしていませんか?

私は、enums> 2^31のような変わったことはしていないことを明確にする必要があるようです。単純な列挙型です。 32ビットまたは64ビットシステムでは、私のソフトウェアは16ビットで動作しません!

enum
+7

'int'は必ずしも4つのバイトではないだろう。 – user657267

+1

'enum/* class */MyEnum:unsigned char {...};'。 C99コンパイラでは、私のクライアントの1人が、enum = sizeof UINT32のサイズを仮定して、無関係のモジュールに陥るエラーを報告しました。 –

+1

...バイトは必ずしも8ビットである必要はありません。 –

答えて

7

は、次の安全でないであろう、常にintた場合:

enum oops { 
    foo = 32767, 
    bar, /*what am I?*/ 
}; 

intは16ビット(それはまだ驚くほど一般的である)限り小さくすることができるからです。 intの32ビットシステムでは、foo = 2147483647とコンパイラを最も確実に設定することができます。は、を基にするタイプとしてintを選択しません。

したがって、巧妙なC++のボディは、基礎となるenum整数型が与えられた値を表現できなければならないことを指定しており、コンパイラは自由にそれを選ぶことができます。 intがマシンのネイティブタイプとみなされることが多いことを考えると、それはしばしば賢明な選択です。

enumの基になるタイプを知りたい場合は、std::underlying_typeがこれを提供します。

+0

'であり、コンパイラはintを基になる型として選択しないことが最も確実です。' MSVCは 'long long'を表す' int'を選択し、切り捨てられます。それは警告を出しますが、私は個人的には間違いであると信じています。 –

7

のは、現代の任意のコンパイラでそれを見てみましょう:

#include <iostream> 
#include <limits> 

enum MySmallSmall { 
    SmallValue = 0, 
}; 

enum MyLongLong { 
    LongValue = std::numeric_limits<long long>::max() 
}; 

int main() { 
    std::cout << "sizeof MySmallSmall is " << sizeof(MySmallSmall) << std::endl; 
    std::cout << "sizeof MyLongLong is " << sizeof(MyLongLong) << std::endl; 
    return 0; 
} 

打ち鳴らすとg ++出力:

のsizeofのMySmallSmall 4

のsizeof MyLongLongは8

しかしためですMS Visual Studioの両方の結果は4です(私はこの座を使ってチェックしましたe http://rextester.com/l/cpp_online_compiler_visualここではコンパイラのバージョンがわかりません)

したがって、列挙型のsizeofに頼ることはできません。

+0

この回答がどのように追加されるのか分かりません。根本的な型が実装定義されているということはすでに述べています。 –

+0

また、ここではMSVCが間違っています。 'long long'の最大値は' int'に収まらないので、コンパイルすべきではありません。 –

+2

@sleeptightpupper質問は "実際には現実には現状のコンパイラではそれをintにしていないのですか?" ...実際の質問に答える方法は一つしかありません。 msvcが標準に準拠していないということは間違いありません。しかし、これは人生であり、開発者はそれを採用する必要があります。 –

-3

GNU ++コンパイラは、あなたが

#include <iostream> 

enum Tmp : unsigned long long int { 
    foo = 600000000000, 
    bar = 12, 
}; 


int main() { 
    Tmp lol; 
     std::cout << sizeof(lol) << " : " << Tmp::foo << " : " << sizeof(Tmp::foo) << std::endl; 
} 

でそれをテストすることができ回答は8