enum
enum 構文 >>-#pragma--enum--(--+-1--------------+--)--------------------->< +-2--------------+ +-4--------------+ +-int------------+ +-small----------+ +-pop------------+ +-system_default-+ '-user_default---'
enum 構文 >>-#pragma--enum--(--+-1--------------+--)--------------------->< +-2--------------+ +-4--------------+ +-8--------------+ +-int------------+ +-intlong--------+ +-small----------+ +-pop------------+ +-system_default-+ '-user_default---'
説明
列挙型を表す場合にコンパイラーで使用されるバイト数を指定します。後続のすべての enum 定義は、コンパイル単位が終了するか、または別の #pragma enum ディレクティブが検出されるまで、このプラグマに影響を受けます。複数のプラグマが使用されている場合は、直前に検出されたプラグマが有効です。ENUM ページで説明されているように、このプラグマによって、ENUM コンパイラー・オプションがオーバーライドされます。
パラメーター
- 1、2、4、8
- 列挙型が 1、2、4、または 8 バイトのコンテナーで保管されるように指定します。 コンテナーの符号は列挙型の値の範囲によって決定されますが、範囲の指定がない場合、符号付きが優先となります。プラグマ enum(8) ディレクティブは、C++ でのみ使用可能です。
- int
- 列挙型は ANSI C、または C++ 規格の列挙型表現に保管されます (4 バイト符号付き)。C++ プログラムでは、列挙型の値が ANSI C++ 規格ごとに 231-1 を超える場合、int コンテナーは 4 バイト符号なしとなります。
- intlong
- 列挙型の値の範囲が int の制限を超えた場合、列挙型が 8 バイトのストレージを専有することを指定します。 列挙型の値の範囲が int の制限を超えない場合は、列挙型は 4 バイトのストレージを専有し、enum(int) が指定されていたように表されます。 プラグマ enum(intlong) ディレクティブは、C++ でのみ使用可能です。
- small
- 後続の列挙型はできる限り最小のコンテナーに置かれ、その列挙型の値が指定されます。コンテナーの符号は列挙型の値の範囲によって決定されますが、範囲の指定がない場合、符号なしが優先となります。
- pop
- 以前に有効だった列挙型のサイズが選択され、現行の設定は破棄されます。
- system_default
- デフォルトの列挙型サイズが選択されます。デフォルトは small オプションです。
- user_default
- ENUM コンパイラー・オプションによって指定された列挙型サイズが選択されます。
enum 設定で使用することができる値の範囲は、以下のとおりです。
| エレメント値の範囲 | Enum オプション | ||||||
|---|---|---|---|---|---|---|---|
| small (デフォルト) |
1 | 2 | 4 | 8 (C++ のみ) |
int | intlong (C++ のみ) |
|
| 0 .. 127 | 1 バイト符号なし | 1 バイト符号付き | 2 バイト符号付き | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| 0 .. 255 | 1 バイト符号なし | 1 バイト符号なし | 2 バイト符号付き | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| -128 .. 127 | 1 バイト符号付き | 1 バイト符号付き | 2 バイト符号付き | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| 0 .. 32767 | 2 バイト符号なし | ERROR | 2 バイト符号付き | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| 0 .. 65535 | 2 バイト符号なし | ERROR | 2 バイト符号なし | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| -32768 .. 32767 | 2 バイト符号付き | ERROR | 2 バイト符号付き | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| 0 .. 2147483647 | 4 バイト符号なし | ERROR | ERROR | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| 0 .. 4294967295 | 4 バイト符号なし | ERROR | ERROR | 4 バイト符号なし | 8 バイト符号付き | C++ 4 バイト符号なし
C ERROR |
4 バイト符号なし |
| -2147483648 .. 2147483647 | 4 バイト符号付き | ERROR | ERROR | 4 バイト符号付き | 8 バイト符号付き | 4 バイト符号付き | 4 バイト符号付き |
| 0 .. (263 -1) (C++ のみ) |
8 バイト符号なし | ERROR | ERROR | ERROR | 8 バイト符号付き | ERROR | 8 バイト符号付き |
| 0.. 2 64
(C++ のみ) |
8 バイト符号なし | ERROR | ERROR | ERROR | 8 バイト符号なし | ERROR | 8 バイト符号なし |
| -2 63 .. (2 63-1) (C++ のみ) |
8 バイト符号付き | ERROR | ERROR | ERROR | 8 バイト符号付き | ERROR | 8 バイト符号付き |
例
以下の例では、#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 オプションでコンパイルされる場合:
enum 定数の範囲は 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)
