共用方式為


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

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

所有執行階段

備註

C++/CX 和 C++/CLI 支援類似於標準 C++ enum class、但另外還加上存取範圍規範的public enum class和private enum class。 在 /clr中, C++11 允許 enum class 型別,但會產生的警告 C4472 以確保您真正想要 ISO 列舉型別而非使用 C++/CX 和 C++/CLI 型別。 如需 ISO 標準 C++ 關鍵字 enum 的詳細資訊,請參閱 C++ 列舉宣告

Windows 執行階段

語法

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

參數

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

  • enumeration-identifier
    列舉的名稱。

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

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

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

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

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

備註

如需詳細資訊與範例,請參閱 Enums

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

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

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

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

需求

編譯器選項:/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 或 C++/CX。

Managed 或 C++/CX 列舉可能會定義如下,

public 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++ 列舉宣告

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

需求

編譯器選項:/clr

範例

範例

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);
} 

Output

  
  
  
  

請參閱

概念

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