共用方式為


enum class (C++ 元件擴充功能)

宣告列舉,這是由一組稱為列舉程式之具名常數所組成的使用者定義型別。

所有執行階段

備註

C++/CX 和 C++/CLI 支援類似於標準 C++ 列舉類別、但另外還加上存取範圍規範的public enum class和private enum class。 如需舊版標準 C++ 關鍵字 enum 的詳細資訊,請參閱 C + + 列舉宣告

Windows 執行階段

語法

access enum class enumeration-identifier [:underlying-type] { enumerator-list } [var];
access enum struct enumeration-identifier [:underlying-type] { enumerator-list } [var];

參數

  • 存取
    列舉的存取範圍,可以是 public 或 private。

  • 列舉識別項
    列舉的名稱。

  • 基礎型別
    (選擇性) 列舉的基礎型別。

    (選擇性)。 僅限 Windows 執行階段) 列舉的基礎型別,這可以是 bool、char、char16、int16、uint16、int、uint32、int64 或 uint64。

  • 列舉程式清單
    列舉程式名稱的逗號分隔清單。

    每個列舉程式的值都是隱含透過編譯器,或明確藉由標記法 (enumerator = constant-expression) 所定義的常數運算式。 根據預設,如果第一個列舉程式是隱含定義的,則其值為零。 每個後續隱含定義的列舉程式都會是上一個列舉程式的值 + 1。

  • var
    (選擇性) 列舉型別變數的名稱。

備註

如需詳細資訊和範例,請參閱列舉

請注意,如果定義列舉程式值的常數運算式無法以基礎型別表示,編譯器將會發出錯誤訊息。 不過,編譯器不會為了不適合基礎型別的值而報告錯誤。 例如:

  • 如果基礎型別是數值,而列舉程式指定了該型別的最大值,則無法表示下一個隱含定義之列舉的值。

  • 如果基礎型別是 bool,而且隱含定義了兩個以上的列舉程式,則無法表示前兩個列舉程式之後的列舉程式。

  • 如果基礎型別是 char16,而列舉值的範圍是從 0xD800 到 0xDFFF,則可以表示這個值。 不過,由於這個值代表半個 Unicode Surrogate 字組,而且不應該出現在隔離中,因此該值在邏輯上不正確。

a6cskb49.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/ZW

Common Language Runtime

語法

access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;

參數

  • access
    列舉的存取範圍。 可以是 public 或 private。

  • enumerator-list
    在列舉中,識別項 (列舉程式) 的逗號分隔清單。

  • name
    列舉的名稱。 不允許匿名 Managed 列舉。

  • type (選擇項)
    識別項的基礎型別。 這可以是任何純量型別,例如 int、short 或 long 的帶正負號或不帶正負號的版本。 同時也允許 bool 或 char。

  • var (選擇項)
    列舉型別變數的名稱。

備註

enum classenum struct 是相等的宣告。

有兩種列舉型別:Managed 和標準。

Managed 列舉可能會定義如下,

enum class day {sun, mon };

並且在語意上相當於:

ref class day {
public:
   static const int sun = 0;
   static const int mon = 1;
};

標準列舉可能會定義如下:

enum day2 {sun, mon, };

並且在語意上相當於:

static const int sun = 0;
static const int mon = 1;

Managed 列舉程式名稱 (識別項) 不會插入至定義列舉所在的範圍中。列舉程式的所有參考都必須是完整 (名稱::識別項)。 因此,您無法定義匿名 Managed 列舉。

標準列舉的列舉程式是強式插入封閉範圍中的。 也就是說,如果有另一個符號,其名稱與封閉範圍中的列舉程式相同時,編譯器將會產生錯誤。

在 Visual C++ 2002 和 Visual C++ 2003 中,弱式插入了列舉程式 (除非另有相同名稱的識別項,否則可顯示在封閉範圍中)。

如果標準 C++ 列舉已定義 (沒有 class 或 struct),則使用 /clr 編譯會使列舉編譯為 Managed 列舉。 列舉仍然含有 Unmanaged 列舉的語意。 請注意,編譯器會插入 Visual C++ 編譯器可辨識的屬性 Microsoft::VisualC::NativeEnumAttribute,以識別程式設計人員使用列舉的目的是要做為原生列舉。 其他編譯器只是將標準列舉視為 Managed 列舉。

以 /clr 編譯的具名標準列舉會在組件中顯示為 Managed 列舉,可由任何其他 Managed 編譯器使用。 不過,未命名的標準列舉在組件中不會是公開可見的。

在 Visual C++ 2002 和 Visual C++ 2003 中,為函式參數中當做型別使用的標準列舉:

// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}

int main() {
   E myi = b;
   f(myi);
}

將會在 MSIL 中針對函式簽章發出下列內容:

void f(int32);

不過,在編譯器目前的版本中,標準列舉是以 [NativeEnumAttribute] 和函式簽章 MSIL 中的下列項目發出做為 Managed 列舉:

void f(E)

如需有關原生列舉的詳細資訊,請參閱 C++ 列舉宣告

在開發環境中,您可以反白顯示關鍵字 (例如 enum class) 並按下 F1,來取得這些關鍵字的 F1 說明。

如需 CLR 列舉的詳細資訊,請參閱:

a6cskb49.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/clr

a6cskb49.collapse_all(zh-tw,VS.110).gif範例

範例

desc

// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };

// standard enum
public enum n { c, d };

// unnamed, standard enum
public enum { e, f } o;

int main() {
   // consume managed enum
   m mym = m::b;
   System::Console::WriteLine("no automatic conversion to int: {0}", mym);
   System::Console::WriteLine("convert to int: {0}", (int)mym);

   // consume standard enum
   n myn = d;
   System::Console::WriteLine(myn);

   // consume standard, unnamed enum
   o = f;
   System::Console::WriteLine(o);
}Optionally, copy this sequence of tags for each example you want, then populate the text nodes. That is, after section+title("Examples")+content, insert: para+embeddedLabel ("Example")+para(sample description); code(sample); para+embeddedLabel("Output"); computerOutput(sample output, including 'br' tag instead of newlines)

Output

  
  
  
  

請參閱

概念

執行階段平台的元件擴充功能