enum
説明
列挙型を表す場合にコンパイラーで使用されるバイト数を指定します。 後続のすべての enum 定義は、コンパイル単位が終了するか、または別の #pragma enum ディレクティブが検出されるまで、このプラグマに影響を受けます。 複数のプラグマが使用されている場合は、直前に検出されたプラグマが有効です。 このプラグマは、 ENUMページで説明されている ENUM
コンパイラー・オプションをオーバーライドします。
パラメーター
- 1、2、4、8
- 列挙型が 1、2、4、または 8 バイトのコンテナーで保管されるように指定します。 コンテナーの符号は列挙型の値の範囲によって決定されますが、範囲の指定がない場合、符号付きが優先となります。 pragma enum(8) ディレクティブは、C++ でのみ使用できます。
- 整数
- 列挙型は ANSI C、または C++ 規格の列挙型表現に保管されます (4 バイト符号付き)。 C++ プログラムでは、列挙型の値が ANSI C++ 規格ごとに 2 31-1 を超える場合、int コンテナーは 4 バイト符号なしとなります。
- intlong
- 列挙型の値の範囲が int の制限を超えた場合、列挙型が 8 バイトのストレージを専有することを指定します。 列挙型の値の範囲が int の制限を超えない場合は、列挙型は 4 バイトのストレージを専有し、enum(int) が指定されていたように表されます。 pragma enum(intlong) ディレクティブは C++ でのみ使用可能です。
- small
- 後続の列挙型はできる限り最小のコンテナーに置かれ、その列挙型の値が指定されます。 コンテナーの符号は列挙型の値の範囲によって決定されますが、範囲の指定がない場合、符号なしが優先となります。
- ポップ (pop)
- 以前に有効だった列挙型のサイズが選択され、現行の設定は破棄されます。
- system_default
- デフォルトの列挙型サイズが選択されます。デフォルトは
small
オプションです。 - user_default
ENUM
コンパイラー・オプションによって指定された列挙型サイズが選択されます。
enum 設定で使用することができる値の範囲は、以下のとおりです。
Range of Element Values | Enum Options | ||||||
---|---|---|---|---|---|---|---|
small (デフォルト) |
1 |
2 |
4 |
8 (C++ のみ) |
int |
intlong (C++ のみ) |
|
0 .. 127 |
1 byte unsigned |
1 byte signed |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 255 |
1 byte unsigned |
1 byte unsigned |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
-128 .. 127 |
1 byte signed |
1 byte signed |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 32767 |
2 bytes unsigned |
ERROR |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 65535 |
2 bytes unsigned |
ERROR |
2 bytes unsigned |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
-32768 .. 32767 |
2 bytes signed |
ERROR |
2 bytes signed |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 2147483647 |
4 bytes unsigned |
ERROR |
ERROR |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 .. 4294967295 |
4 bytes unsigned |
ERROR |
ERROR |
4 bytes unsigned |
8 bytes signed |
C++ 4 bytes unsigned
|
4 bytes unsigned |
-2147483648 .. 2147483647 |
4 bytes signed |
ERROR |
ERROR |
4 bytes signed |
8 bytes signed |
4 bytes signed |
4 bytes signed |
0 ..
(263 -1) (C++ のみ) |
8 bytes
unsigned |
ERROR |
ERROR |
ERROR |
8
bytes signed |
ERROR |
8
bytes signed |
0.. 2 64 (C++ のみ) |
8 bytes
unsigned |
ERROR |
ERROR |
ERROR |
8
bytes unsigned |
ERROR |
8
bytes unsigned |
-2 63 ..
(2 63-1) (C++ のみ) |
8 bytes
signed |
ERROR |
ERROR |
ERROR |
8
bytes signed |
ERROR |
8
bytes signed |
例
以下の例では、#pragma enum およびコンパイラー・オプションのさまざまな使用が示されています。
- enum の宣言内で #pragma enum を使用し、enum のストレージ割り振りを変更することはできません。 以下のコード・セグメントによって警告が生成され、enum オプションの 2 番目の出現は無視されます。
#pragma enum ( small ) enum e_tag { a, b, #pragma enum ( int ) /* error: cannot be within a declaration */ c } e_var; #pragma enum ( pop ) /* second pop isn't required */
- C コンパイラーの場合、enum 定数の範囲は、unsigned int または int (signed int) のいずれかの範囲内である必要があります。 C++ コンパイラーの場合、enum 定数の範囲は、unsigned long long または long long (signed long long) のいずれかの範囲内である必要があります。 例えば、C コンパイラーが使用されている場合、以下のコード・セグメントにはエラーが含まれていますが、C++ コンパイラーが使用されている場合は、コンパイルは成功します。
#pragma enum ( small ) enum e_tag { a=-1, b=2147483648 /* C compiler error: larger than maximum int */ } e_var; #pragma enum ( pop ) #pragma enum ( small ) enum e_tag { a=0, b=4294967296 /* C compiler error: larger than maximum int */ } e_var; #pragma enum ( pop )
- pop オプションの使用の 1 つとして、メインファイルのデフォルトとは異なる列挙型ストレージを指定しているインクルード・ファイルの最後で、列挙型サイズの設定をポップすることが挙げられます。 例えば、以下のインクルード・ファイルでは small_enum.h によってさまざまな最小値の列挙型が宣言された後、インクルード・ファイルの最後で、オプション・スタックの最後の値に指定がリセットされています。
以下のソース・ファイル (int_file.c) には、small_enum.h が含まれています。#ifndef small_enum_h #define small_enum_h /* * File small_enum.h * This enum must fit within an unsigned char type */ #pragma enum ( small ) enum e_tag {a, b=255}; enum e_tag u_char_e_var; /* occupies 1 byte of storage */ /* Pop the enumeration size to whatever it was before */ #pragma enum ( pop ) #endif
列挙型 test_enum および first_order は、どちらも 4 バイトのストレージを持つ int 型です。 small_enum.h で定義される変数 u_char_e_var のストレージは 1 バイトで、unsigned char データ型で表現されます。/* * File int_file.c * Defines 4 byte enums */ #pragma enum ( int ) enum testing {ONE, TWO, THREE}; enum testing test_enum; /* various minimum-sized enums are declared */ #include "small_enum.h" /* return to int-sized enums. small_enum.h has popped the enum size */ enum sushi {CALIF_ROLL, SALMON_ROLL, TUNA, SQUID, UNI}; enum sushi first_order = UNI;
- 以下のコード・フラグメントが ENUM = *SMALL オプションでコンパイルされる場合:
列挙型定数の範囲は 0 から 2 です。 この範囲は、上記の表で説明されている範囲内のすべてに該当します。 優先順位に基づき、コンパイラーでは事前定義された unsigned char 型が使用されます。enum e_tag {a, b, c} e_var;
- 以下のコード・フラグメントが ENUM = *SMALL オプションでコンパイルされる場合:
enum 定数の範囲は -129 から -127 です。 この範囲は short (signed short) および int (signed int) の範囲内のみとなります。 short (signed short) はより小さいため、enum を表す場合に使用されます。enum e_tag {a=-129, b, c} e_var;
- ファイル myprogram.c を以下のコマンドを使用してコンパイルする場合:
ENUM オプションが #pragma enum ディレクティブによってオーバーライドされない限り、ソース・ファイル内のすべての enum 変数のストレージは最小となります。CRTBNDC MODULE(MYPROGRAM) SRCMBR(MYPROGRAM) ENUM(*SMALL)
- 以下の行が含まれているファイル yourfile.c をコンパイルする場合:
以下のコマンドを使用する場合:enum testing {ONE, TWO, THREE}; enum testing test_enum; #pragma enum ( small ) enum sushi {CALIF_ROLL, SALMON_ROLL, TUNA, SQUID, UNI}; enum sushi first_order = UNI; #pragma enum ( int ) enum music {ROCK, JAZZ, NEW_WAVE, CLASSICAL}; enum music listening_type;
enum 変数 test_enum および first_order は最小化されます (すなわち、各ストレージは 1 バイトのみとなります)。 その他の enum 変数 (listening_type) は int 型で、ストレージは 4 バイトです。CRTBNDC MODULE(YOURFILE) SRCMBR(YOURFILE)