、列挙定数は常にタイプint
(等価的に、signed int
)のです。しかし、そのような定数は通常メモリに格納されないので、メモリの種類にはあまり影響しません。
列挙型の宣言されたオブジェクトは、列挙型自体であり、char
または符号付きまたは符号なし整数型と互換性があります。型の選択は実装定義です(つまり、コンパイラが選択しますが、どのようにして選択するのかを文書化する必要があります)。唯一の要件は、型がすべての定数の値を格納できる必要があるということです。
定数が列挙型ではなくint
であることは間違いですが、それは言語がどのように定義されているかです(理由は歴史的で、C++には異なる規則があります)。例えば
、所与:
enum foo { x, y, z };
enum foo obj;
obj = z;
発現z
型int
であり、(ちょうど小数点定数2
等)の値2を有しているが、オブジェクトobj
型enum foo
であり、小さくてもよいです1バイトとして、コンパイラによって異なります。割り当てobj = z;
には、int
からenum foo
への暗黙的な変換が含まれます(変換には追加のコードが必要な場合もあります)。
一部のコンパイラでは、列挙型に選択する型を指定するための標準的ではない方法があります。何人かは標準に違反することさえあるかもしれません。コンパイラのドキュメントを参照してsizeof (enum foo)
の値を出力し、必要に応じて生成されたコードを調べます。
コンパイラは、言語によって課せられた制約内で合理的な決定を下す可能性があります。メモリが不足している組み込みシステムを対象としたコンパイラでは、特にコンパイラが小さな型を選択するか、指定することができます。コンパイラのドキュメントを参照してください。
Ianの答えによると、メモリの使用量を自分で制御する場合は、char
またはunsigned char
のオブジェクトを使用できます。ただし、定数を定義するのにまだenum
の定義を使用できます。たとえば、
enum { x, y, z }; // No tag, so you can't declare objects of this type
typedef unsigned char foo; // an enum_foo object is guaranteed to be 1 byte
foo obj = z;
参照:C standardのセクション6.7.2.2を参照してください。このリンクは、2011年のISO C標準の最近のドラフトの1.7メガバイトのPDFへのリンクです。この特定のセクションは1989年以来大きく変化していません。
ありがとう、私はマニュアルを手元に持っていなかった – Flot2011
@ Flot2011:本当に!これはインターネットです。マニュアルは常に便利です! [*私はそれをダウンロードしました](http://www.iar.com/en/Products/IAR-Embedded-Workbench/ARM/User-guides/)。私はコンパイラを持っていませんが、以前は他のIAR製品を使用していたので、IDEをインストールするときにマニュアルがローカルにインストールされ、ヘルプメニューから利用できますPDF)。 – Clifford
:OK、とにかく説明が必要です。ここでは、私はこのコンパイラではまったく動作しません。私はVS2003で作業しています。クライアントは私のライセンスを購入したくないので、後でクライアントのマシンで再コンパイルします。 IARのどのバージョンが最終的に使用されるかわからなかったので、私は一般的な質問をよくすると思っていましたが、実際にはあなたは正しいです、私はここで少し怠惰でした。 – Flot2011