#pragma enum ディレクティブは、後続の enum 変数のサイズを指定します。宣言の左中括弧のサイズは、宣言内でさらに enum ディレクティブが出現するかどうかに関係なく、宣言に影響を与えます。このプラグマは、 使用されるたびに値をスタックにプッシュし、 リセット・オプションを使用すれば、 直前にプッシュした値に戻ることができます。
>>-#--pragma--enum--+-(--suboption--)-+------------------------>< '-=--suboption----'
ここで、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の説明を参照してください。
列挙型の値の範囲が int の限度を超えないと、列挙型はストレージの 4 バイトを占有し、 int で表されます。 |
small | 列挙型は、すべての変数を含めることができる最小の整数型です。
8 バイトの列挙型の結果の場合、使用される実際の列挙型はコンパイル・モードに依存します。#pragma enumの説明を参照してください。 |
pop | このサブオプションは、列挙型のサイズ設定を直前の #pragma enum 設定にリセットします。直前の設定がない場合は、-qenum のコマンド行設定が使用されます。 |
reset | pop と同じ。 このオプションは、後方互換性のために用意されています。 |
空のスタックをポップすると、警告メッセージが生成され、enum 値は未変更のままとなります。
#pragma enum ディレクティブは、-qenum コンパイラー・オプションをオーバーライドします。
ソース・ファイルに入れる #pragma enum ディレクティブごとに、そのファイルの終わりの前に、対応する #pragma enum=reset を入れることをお勧めします。これは、1 つのファイルがそのファイルを #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 e_tag {a, b, c} e_var;列挙型定数の範囲は 0 から 2 までになります。 この範囲は、上記テーブルに記述されているすべての範囲に収まります。 優先順位に基づいて、 コンパイラーは、事前定義型 unsigned char を使用します。
enum e_tag {a=-129, b, c} e_var;列挙型定数の範囲は -129 から -127 までになります。 この範囲は、short (signed short) と int (signed int) の範囲の間だけになります。short (signed short) は より小さいので、enum を表すために使用されます。
xlc++ myprogram.C -qenum=smallファイル myprogram.C に #pragma options=int ステートメントが含まれていないと想定した場合、ソース・ファイル内のすべての enum 変数が占有するストレージの量は最小になります。
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;以下のコマンドを使用すると、
xlc++ yourfile.Cenum 変数 first_order だけが最小サイズになります (つまり、enum 変数 first_order は 1 バイトのストレージのみを占有します)。他の 2 つの enum 変数 test_enum と listening_type は int 型となり、4 バイトのストレージを占有します。
以下の例は、無効な列挙型または #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
関連情報