enum 类(C++ 组件扩展)

在命名空间范围内声明一种枚举,该枚举是用户定义的类型,其包含称为枚举数的命名常数的集。

所有运行时

备注

C++/CX 和 C++/CLI 支持public enum class和类似于标准 C++enum class但是除了辅助功能说明符的private enum class 在 /clr下,C++11 enum class 类型上使用,但要生成警告 C4472,这个警告为了确保非常希望 ISO 枚举类型而不是 C++/CX 和 C++/CLI 类型。 有关ISO Standard 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
    枚举名称的逗号分隔列表。

    每个由编译器隐式定义或由表示法显式定义的的枚举数的值是常数表达式,enumerator = constant-expression。 默认情况下,如果第一个枚举数是隐式定义的,其值为零。 每个后续隐式定义枚举数的值为前一枚举数的值 + 1。

  • var
    (可选)枚举类型变量名称。

备注

有关更多信息和示例,请参见Enums

注意:如果定义枚举数值的常数表达式不能由underlying-type表示,那么编译器将发出错误消息。但是,编译器不会对不适合基础类型的值报错。 例如:

  • 如果underlying-type是数字,并且枚举数为该类型指定最大值,则下一个隐式定义的枚举值将不显示。

  • 如果 underlying-type 是 bool,且隐式定义了两个以上的枚举数,则只显示前两个枚举数。

  • 如果 underlying-type 是 char16,且枚举值的范围是从 0xD800 到 0xDFFF,则可显示该值。 但是,该值在逻辑上不正确,因为它表示 Unicode 代理项对的一半,并且不应隔离出现。

要求

编译器选项:/ZW

公共语言运行时

语法

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

参数

  • access
    枚举的可访问性。可以是 public 或 private。

  • enumerator-list
    以逗号分隔的枚举中标识符(枚举数)列表。

  • name
    枚举的名称。不允许匿名托管枚举。

  • type(可选)
    “标识符”的基础类型。它可以是任何标量类型,例如 int、short 或 long 的有符号或无符号的版本,bool or char也被允许。

  • var(可选)
    枚举类型变量名称。

备注

枚举类枚举结构为等效声明。

有两种类型的枚举:托管枚举或C++/CX枚举和标准枚举。

托管或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;

托管枚举数名称(标识符)未被插入到定义枚举的范围;所有对枚举数的引用必须被完全限定(名称(::标识符)。因此,不能定义匿名托管枚举。

标准枚举的枚举数强插入到封闭范围。也就是说,如果封闭范围存在与枚举名称相同的其他符号,编译器将生成错误。

在 Visual C++ 2002 和 Visual C++ 2003 中,弱插入了枚举数(除非存在另一个同名的标识符,否则在封闭范围中可见)。

如果标准 C++ 枚举定义(没有或 struct),则使用**/clr**进行的编译将导致枚举被编译为托管枚举。枚举仍具有非托管枚举的语义。注意:编译器插入 Visual C++ 编译器可识别的属性[Microsoft::VisualC::NativeEnumAttribute],以标识程序员将枚举变为本机枚举的意图。其他编译器将直接将标准枚举视作托管枚举。

已命名的标准枚举由 /clr 编译,可作为托管枚举显示在程序集中,也可由其他任何托管编译器使用。但是,未命名的标准枚举在程序集中不能公开可见。

在 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 中的以下内容用作函数签名:

void f(E)

有关本机枚举的更多信息,请参见 C++ 枚举声明

有关 CLR 枚举的更多信息,请参见:

要求

编译器选项:/clr

示例

示例

降序

// 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

  不自动转换为 int:b
  
转换为 int: 1
  
1
  
1

请参见

概念

适用于运行时平台的组件扩展