enum

Cコンパイラー

enum 構文 

構文図を読むビジュアル構文図をスキップ#pragmaenum( 124intsmallpopsystem_defaultuser_default )
C++ コンパイラー

enum 構文 

構文図を読むビジュアル構文図をスキップ#pragmaenum( 1248intintlongsmallpopsystem_defaultuser_default )

説明

列挙型を表す場合にコンパイラーで使用されるバイト数を指定します。 後続のすべての 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 設定で使用することができる値の範囲は、以下のとおりです。

表 1. 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

C ERROR

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 およびコンパイラー・オプションのさまざまな使用が示されています。
  1. 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 */ 
  2. 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 )
  3. pop オプションの使用の 1 つとして、メインファイルのデフォルトとは異なる列挙型ストレージを指定しているインクルード・ファイルの最後で、列挙型サイズの設定をポップすることが挙げられます。 例えば、以下のインクルード・ファイルでは 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
    以下のソース・ファイル (int_file.c) には、small_enum.h が含まれています。
    /*
     * 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;
    列挙型 test_enum および first_order は、どちらも 4 バイトのストレージを持つ int 型です。 small_enum.h で定義される変数 u_char_e_var のストレージは 1 バイトで、unsigned char データ型で表現されます。
  4. 以下のコード・フラグメントが ENUM = *SMALL オプションでコンパイルされる場合:
    enum e_tag {a, b, c} e_var;
    列挙型定数の範囲は 0 から 2 です。 この範囲は、上記の表で説明されている範囲内のすべてに該当します。 優先順位に基づき、コンパイラーでは事前定義された unsigned char 型が使用されます。
  5. 以下のコード・フラグメントが ENUM = *SMALL オプションでコンパイルされる場合:
    enum e_tag {a=-129, b, c} e_var;
    enum 定数の範囲は -129 から -127 です。 この範囲は short (signed short) および int (signed int) の範囲内のみとなります。 short (signed short) はより小さいため、enum を表す場合に使用されます。
  6. ファイル myprogram.c を以下のコマンドを使用してコンパイルする場合:
    CRTBNDC MODULE(MYPROGRAM) SRCMBR(MYPROGRAM) ENUM(*SMALL)
    ENUM オプションが #pragma enum ディレクティブによってオーバーライドされない限り、ソース・ファイル内のすべての enum 変数のストレージは最小となります。
  7. 以下の行が含まれているファイル 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;
    以下のコマンドを使用する場合:
    CRTBNDC MODULE(YOURFILE) SRCMBR(YOURFILE)
    enum 変数 test_enum および first_order は最小化されます (すなわち、各ストレージは 1 バイトのみとなります)。 その他の enum 変数 (listening_type) は int 型で、ストレージは 4 バイトです。