#pragma enum ディレクティブは、後続の enum 変数のサイズを指定します。宣言の左方中括弧のサイズは、宣言内で enum ディレクティブがさらに生じるかどうかに関係なく、宣言に影響を与えます。このプラグマは、使用されるたびに値をスタックにプッシュし、リセット・オプションを使用すれば、直前にプッシュした値に戻ることができます。
ここで、suboption は次のいずれかです。
1 列挙型は長さが 1 バイトで、列挙の値の範囲が signed char の制限内である場合、型は char で、そうでない場合は unsigned char です。 2 列挙型は長さが 2 バイトで、列挙の値の範囲が signed short の制限内である場合、型は short で、そうでない場合は unsigned short です。 4 列挙型は長さが 4 バイトで、列挙の値の範囲が signed int の制限内である場合、型は int で、そうでない場合は unsigned int です。 8 列挙型は長さが 8 バイトです。
32 ビット・コンパイル・モードでは、列挙値の範囲が signed long long の制限内にある場合、その列挙は long long 型で、そうでない場合は unsigned long long です。
64 ビット・コンパイル・モードでは、列挙値の範囲が signed long の制限内である場合は、その列挙は long 型で、そうでない場合は unsigned long です。int #pragma enum=4 と同じ。 intlong 列挙の値の範囲が int の制限を越える場合、列挙がストレージの 8 バイトを占有するように指定します。 #pragma enum=8 の説明を参照してください。
列挙の値の範囲が int の制限を超えない場合は、列挙は 4 バイトのストレージを占有し、 int によって示されます。
small 列挙型は、すべての変数を含むことができる最小の整数型です。
8 バイトの enum が結果として生じる場合、実際に使用される列挙型はコンパイル・モードに依存しています。 #pragma enum=8 の説明を参照してください。
pop このサブオプションは、enum サイズ設定を前の #pragma enum 設定にリセットします。前の設定がない場合、 -qenum のコマンド行設定が使用されます。 reset pop と同じ。このオプションは、後方互換性のために用意されています。
空のスタックをポップすると、警告メッセージが生成され、enum 値は未変更のままとなります。
#pragma enum ディレクティブは、-qenum コンパイラー・オプションをオーバーライドします。
ソース・ファイルに組み込んだ各 #pragma enum ディレクティブごとに、対応する #pragma enum=reset を該当するファイルの終わりの前に組み込むようにしてください。これは、 #include する他のファイルの enum 設定がファイルによって変更される可能性をなくす唯一の方法です。
#pragma options enum= ディレクティブは、 #pragma enum の代わりに使用することができます。この 2 つのプラグマは交換可能です。
#pragma enum=reset ディレクティブに対応する -qenum=reset オプションは存在しません。-qenum=reset を使用しようとすると、警告メッセージが生成され、このオプションは無視されます。
#pragma enum(1) #pragma enum(2) #pragma enum(4) #pragma enum(pop) /* will reset enum size to 2 */ #pragma enum(reset) /* will reset enum size to 1 */ #pragma enum(pop) /* will reset enum size to the -qenum setting, assuming -qenum was specified on the command line. If -qenum was not specified on the command line, the compiler default is used. */
#ifndef small_enum_h #define small_enum_h 1 /* * File small_enum.h * This enum must fit within an unsigned char type */ #pragma options enum=small enum e_tag {a, b=255}; enum e_tag u_char_e_var; /* occupies 1 byte of storage */ /* Reset the enumeration size to whatever it was before */ #pragma options enum=reset #endif
以下のソース・ファイル int_file.c には、small_enum.h が組み込まれています。
/* * File int_file.c * Defines 4 byte enums */ #pragma options 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 reset the * enum size */ enum sushi {CALIF_ROLL, SALMON_ROLL, TUNA, SQUID, UNI}; enum sushi first_order = UNI;
列挙 test_enum および first_order は、両方とも 4 バイトのストレージを占有し、 int 型です。small_enum.h で定義された変数 u_char_e_var は、 1 バイトのストレージを占有し、unsigned char データ型で表されます。
enum 定数の範囲は 0 から 2 までになります。この範囲は、上記の表で説明したいずれの範囲にも収まります。優先順位に基づいて、コンパイラーは、事前定義型 unsigned char を使用します。enum e_tag {a, b, c} e_var;
enum 定数の範囲は -129 から -127 までになります。この範囲は、short (signed short) および int (signed int) の範囲にしか収まりません。 short (signed short) は小さ過ぎるため、 enum を表すのに使用されます。enum e_tag {a=-129, b, c} e_var;
ファイル myprogram.C に #pragma options=int ステートメントが含まれていないとすると、ソース・ファイル内の enum 変数は、すべて最小量のストレージを占有します。xlc++ myprogram.C -qenum=small
以下のコマンドの使用enum testing {ONE, TWO, THREE}; enum testing test_enum; #pragma options enum=small enum sushi {CALIF_ROLL, SALMON_ROLL, TUNA, SQUID, UNI}; enum sushi first_order = UNI; #pragma options enum=int enum music {ROCK, JAZZ, NEW_WAVE, CLASSICAL}; enum music listening_type;
enum 変数 first_order のみが最小サイズになります (つまり、enum 変数 first_order は 1 バイトのストレージしか占有しません)。他の 2 つの enum 変数 test_enum および listening_type は int 型となり、4 バイトのストレージを占有します。xlc++ yourfile.C
以下の例は、無効な列挙または #pragma enum の使用です。
#pragma enum=small enum e_tag { a, b, #pragma enum=int /* error: cannot be within a declaration */ c } e_var; #pragma enum=reset /* second reset isn't required */
#pragma enum=small enum e_tag { a=-1, b=2147483648 /* error: larger than maximum int */ } e_var; #pragma options enum=reset
#pragma options enum=small enum e_tag { a=0, b=4294967296 /* error: larger than maximum int */ } e_var; #pragma options enum=reset