C/C99/C ++/C ++ X/GNU C/GNU C99での列挙の署名
質問
は enum
署名済みまたは署名されていないタイプ?酵素の署名はC/C99/ANSI C/C ++/C ++ X/GNU C/GNU C99で異なりますか?
ありがとう
解決
列挙は整数で表されることが保証されていますが、実際のタイプ(およびその署名)は実装依存です。
列挙者の1つに負の値を与えることにより、登録型で列挙されるように強制することができます。
enum SignedEnum { a = -1 };
C ++ 0xでは、列挙の基礎となるタイプの列挙を明示的に指定できます。
enum ShortEnum : short { a };
(C ++ 0xは、スコープされた列挙のサポートも追加します)
完全性のために、それを追加します Cプログラミング言語、第2版。, 、列挙者はタイプを持つとして指定されています int
(p。215)。 K&RはC標準ではないため、ISO Cコンパイラにとっては規範ではありませんが、ISO C標準よりも前のものであるため、少なくとも歴史的な観点からは興味深いものです。
他のヒント
これは古い質問です...しかし、私はこれを見つけたばかりです:
typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;
たとえば、2ビットの符号なしインデックスとして使用できます。
typedef struct {
ENUMNAME i:2;
} STRUCTNAME;
GCCアームで試してみました - 動作しません。
また、windbgはstructname.iをasとして示しています 番号, 、V0-V3としてではありません。
所属していません StackOverflow