2

32Kのメモリを搭載し、IAREWARMv6.30を使用してプレーンCで書き込みを行う組み込みデバイスを使用しています。

コードを読みやすくするために、いくつかの列挙型を定義したいと思います。たとえば、次のようなものです。

{RIGHT_BUTTON, CENTER_BUTTON, LEFT_BUTTON}

0、1、2の値を使用する代わりに、すでに不足している追加のメモリが必要になるのではないかと思います。

だから私は2つの質問があります:1)列挙型をintではなくshort型またはbyte型にすることはできますか?2)列挙型を定義する正確なメモリインプリントとは何ですか?

4

4 に答える 4

6

完全に準拠したISOCでは、列挙型定数のサイズとタイプはsigned int。一部の組み込みシステムコンパイラは、最適化または拡張として意図的にこれに準拠していません。

ISO C ++では、「列挙型の基になる型は、列挙型で定義されたすべての列挙型値を表すことができる整数型です。」したがって、コンパイラーは可能な限り最小の型を自由に使用でき、ほとんどの場合、使用する必要はありません。それで。

あなたの場合(IAR EWARM)、マニュアルには次のように明確に記載されています。

ここに画像の説明を入力してください

オプションは必要ありません。実際、--enum_is_int準拠動作を強制するために使用する必要があります。他のコンパイラは、動作が異なる場合や、これを制御するための拡張機能、プラグマ、またはオプションが異なる場合があります。このようなことは通常、ドキュメントで定義されています。

于 2012-04-04T16:16:56.710 に答える
2

本当にデータサイズをaに抑える必要がある場合は、常に定数値charのセットを使用して状態#defineを表し、enum割り当てとテストでのみこれらの値を使用できます。

于 2012-04-04T11:14:25.717 に答える
2

準拠コンパイラの場合、列挙型定数は常に型int(と同等signed int)です。ただし、このような定数は通常、メモリに格納されないため、そのタイプはメモリ要件にあまり影響を与えない可能性があります。

列挙型の宣言されたオブジェクトは、列挙型自体であり、char符号付きまたは符号なし整数型と互換性があります。タイプの選択は実装によって定義されます(つまり、コンパイラーは選択できますが、選択方法を文書化する必要があります)。唯一の要件は、型がすべての定数の値を格納できる必要があることです。

int定数が列挙型ではなく型であるのは確かに奇妙ですが、それが言語の定義方法です(理由は歴史的であり、C ++には異なる規則があります)。

たとえば、次のようになります。

enum foo { x, y, z };
enum foo obj;
obj = z;

zは型intであり、値は2(10進定数と同じ2)ですが、オブジェクトobjは型enum fooであり、コンパイラーによっては1バイト程度の場合もあります。割り当てには、からへobj = z;の暗黙の変換が含まれます(その変換には追加のコードが必要な場合と不要な場合があります)。intenum 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標準のセクション6.7.2.2 。リンクは、2011ISOC標準の最近のドラフトの1.7メガバイトのPDFへのリンクです。この特定のセクションは、1989年以降大幅に変更されていません。

于 2012-04-04T22:14:19.647 に答える
1

ANSI Cコンパイラは、常に列挙int型を型の変数を表すとして表現しますenum

http://en.wikipedia.org/wiki/Enumerated_type#C_and_syntactically_similar_languages

プログラムでsを使用する1つのオプションはint、値を定義するためにそれらを使用することですが、char実際に使用されるときにキャストされます

char value = (char)Buttons.RIGHT_BUTTON;
于 2012-04-04T07:34:42.073 に答える