枚举类(C++/CLI 和 C++/CX)

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

所有运行时

备注

C++/CX 和 C++/CLI 支持 public enum class 和 private enum class,它们与标准 C++ enum class 类似,不同之处在于增加了可访问性说明符。 在 /clr下,允许使用 C++11 enum class 类型,但会生成警告 C4472,这是为了确保你确认自己确实需要使用 ISO 枚举类型,而不是 C++/CX 和 C++/CLI 类型。 若要详细了解 ISO 标准 C++ enum关键字,请参阅枚举

Windows 运行时

语法

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

参数

访问
枚举的可访问性可以是 publicprivate

enumeration-identifier
枚举的名称。

underlying-type
(可选)枚举的基础类型。

(可选。仅限 Windows 运行时)枚举的基础类型的可取值为 boolcharchar16int16uint16intuint32int64uint64

enumerator-list
以逗号分隔的枚举器名称列表。

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

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

备注

有关详细信息和示例,请参阅 枚举

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

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

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

  • 如果 underlying-typechar16,且枚举值的范围是从 0xD800 到 0xDFFF,则可显示该值。 但是,该值出现逻辑错误,因为它表示半个 Unicode 代理项对,且不会以分隔形式显示。

要求

编译器选项:/ZW

公共语言运行时

语法

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

参数

访问
枚举的可访问性。 可以为 publicprivate

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

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

type
(可选)identifiers 的基础类型。 可以是任意标量类型,如 intshortlong 的有符号或无符号版本。 也可以是boolchar

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

备注

enum classenum struct 是等效声明。

有两种枚举:托管或 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;

托管枚举器名称 (identifiers) 注入到定义枚举的作用域;必须完全限定对枚举器的所有引用 (name::identifier)。 为此,你不能定义匿名托管的枚举。

将标准枚举的枚举器强注入到封闭作用域。 即,如果存在名称与封闭作用域中的枚举器名称相同的另一个符号,则编译器将生成错误。

在 Visual Studio 2002 和 Visual Studio 2003 中,枚举器是弱插入(在封闭作用域中可见,除非还有同名的标识符)。

如果定义了标准 C++ 枚举(无 classstruct),使用 /clr 进行编译时将导致枚举编译为托管枚举。 枚举仍然具有非托管枚举的语义。 请注意,编译器插入特性 Microsoft::VisualC::NativeEnumAttribute,以标识程序员要将枚举变为本机枚举的意图。 其他编译器只会将标准枚举视为托管枚举。

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

在 Visual Studio 2002 和 Visual Studio 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);
}
no automatic conversion to int: b

convert to int: 1

1

1

另请参阅

.NET 和 UWP 的组件扩展