#pragma enum

説明

#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 の使用を試行すると、警告メッセージが生成されて、オプションが無視されます。

  1. 以下のコード・セグメントに pop および 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. */
  2. reset サブオプションは、一般に、 メインファイルのデフォルトと異なる列挙型のストレージを指定する組み込みファイルの最後で、 設定された列挙型のサイズをリセットするために使用します。例えば、以下の組み込みファイル small_enum.h はさまざまな最小サイズの列挙を宣言し、組み込みファイルの最後に、その指定をオプション・スタックの最後の値にリセットしています。
    #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_enumfirst_order の両方ともストレージの 4 バイトを占有し、int 型です。small_enum.h に定義された変数 u_char_e_var は 1 バイトのストレージを占有し、unsigned char データ型で表されます。

  3. 以下の C コード・フラグメントを enum=small オプションを指定してコンパイルした場合:
    enum e_tag {a, b, c} e_var;
    列挙型定数の範囲は 0 から 2 までになります。 この範囲は、上記テーブルに記述されているすべての範囲に収まります。 優先順位に基づいて、 コンパイラーは、事前定義型 unsigned char を使用します。
  4. 以下の C コード・フラグメントを enum=small オプションを指定してコンパイルした場合:
    enum e_tag {a=-129, b, c} e_var;
    列挙型定数の範囲は -129 から -127 までになります。 この範囲は、short (signed short)int (signed int) の範囲の間だけになります。short (signed short) は より小さいので、enum を表すために使用されます。
  5. 以下のコマンドを使用してファイル myprogram.C をコンパイルした場合:
    xlc++ myprogram.C -qenum=small
    ファイル myprogram.C#pragma options=int ステートメントが含まれていないと想定した場合、ソース・ファイル内のすべての enum 変数が占有するストレージの量は最小になります。
  6. 以下の行が含まれたファイル yourfile.C をコンパイルする場合、
    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.C
    enum 変数 first_order だけが最小サイズになります (つまり、enum 変数 first_order は 1 バイトのストレージのみを占有します)。他の 2 つの enum 変数 test_enumlistening_typeint 型となり、4 バイトのストレージを占有します。

以下の例は、無効な列挙型または #pragma enum の使用を示したものです。

関連情報