enum

C コンパイラー
構文図を読む構文図をスキップする
enum 構文 

>>-#pragma--enum--(--+-1--------------+--)---------------------><
                     +-2--------------+      
                     +-4--------------+      
                     +-int------------+      
                     +-small----------+      
                     +-pop------------+      
                     +-system_default-+      
                     '-user_default---'      

C++
コンパイラー
構文図を読む構文図をスキップする
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 設定で使用することができる値の範囲は、以下のとおりです。

表 1. 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 およびコンパイラー・オプションのさまざまな使用が示されています。
  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;
    enum 定数の範囲は 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 バイトです。