klasa wyliczeniowa (C++/CLI i C++/CX)

Deklaruje wyliczenie w zakresie przestrzeni nazw, który jest typem zdefiniowanym przez użytkownika składającym się z zestawu nazwanych stałych nazywanych modułami wyliczania.

Wszystkie środowiska wykonawcze

Uwagi

C++/CX i C++/CLI obsługują publiczną klasę wyliczenia i prywatną klasę wyliczenia, która jest podobna do standardowej klasy wyliczenia języka C++, ale z dodatkiem specyfikatora ułatwień dostępu. W obszarze /clr typ klasy wyliczenia C++11 jest dozwolony, ale wygeneruje ostrzeżenie C4472, które ma zapewnić, że naprawdę potrzebujesz typu wyliczenia ISO, a nie typu C++/CX i C++/CLI. Aby uzyskać więcej informacji na temat słowa kluczowego ISO Standard C++ enum , zobacz Wyliczenia.

Środowisko wykonawcze systemu Windows

Składnia

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

Parametry

Dostęp
Dostępność wyliczenia, które może być public lub private.

enumeration-identifier
Nazwa wyliczenia.

typ bazowy
(Opcjonalnie) Podstawowy typ wyliczenia.

(Opcjonalnie. tylko środowisko wykonawcze systemu Windows) Podstawowym typem wyliczenia, które może być bool, char, char16, intuint16uint32int16int64lub .uint64

enumerator-list
Rozdzielana przecinkami lista nazw modułów wyliczania.

Wartość każdego modułu wyliczającego jest wyrażeniem stałym, które jest definiowane niejawnie przez kompilator lub jawnie za pomocą notacji, wyrażenia stałe-wyliczenia=. Domyślnie wartość pierwszego modułu wyliczającego wynosi zero, jeśli jest niejawnie zdefiniowana. Wartość każdego kolejnego niejawnie zdefiniowanego modułu wyliczającego jest wartością poprzedniego modułu wyliczającego + 1.

var
(Opcjonalnie) Nazwa zmiennej typu wyliczenia.

Uwagi

Aby uzyskać więcej informacji i przykłady, zobacz wyliczenie.

Należy pamiętać, że kompilator emituje komunikaty o błędach, jeśli wyrażenie stałe definiujące wartość modułu wyliczającego nie może być reprezentowane przez typ źródłowy. Jednak kompilator nie zgłasza błędu dla wartości, która jest nieodpowiednia dla typu bazowego. Przykład:

  • Jeśli typ źródłowy jest liczbowy, a moduł wyliczający określa maksymalną wartość tego typu, nie można przedstawić wartości następnej niejawnie zdefiniowanej wyliczenia.

  • Jeśli typ źródłowy to bool, a więcej niż dwa moduły wyliczane są niejawnie zdefiniowane, moduły wyliczania po dwóch pierwszych nie mogą być reprezentowane.

  • Jeśli typ źródłowy to char16, a wartość wyliczenia waha się od 0xD800 przez 0xDFFF, wartość może być reprezentowana. Jednak wartość logicznie niepoprawna, ponieważ reprezentuje pół pary zastępczej Unicode i nie powinna być widoczna w izolacji.

Wymagania

Opcja kompilatora: /ZW

środowiska uruchomieniowe w trakcie wykonania

Składnia

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

Parametry

Dostęp
Dostępność wyliczenia. Może to być wartość public lub private.

enumerator-list
Rozdzielana przecinkami lista identyfikatorów (wyliczeń) w wyliczeniem.

name
Nazwa wyliczenia. Anonimowe zarządzane wyliczenia są niedozwolone.

type
(Opcjonalnie) Podstawowy typ identyfikatorów. Może to być dowolny typ skalarny, taki jak podpisane lub niepodpisane wersje int, shortlub long. bool lub char jest również dozwolony.

var
(Opcjonalnie) Nazwa zmiennej typu wyliczenia.

Uwagi

Klasy wyliczenia i struktura wyliczenia są równoważnymi deklaracjami.

Istnieją dwa typy wyliczenia: zarządzane lub C++/CX i standardowe.

Wyliczenie zarządzane lub C++/CX może być zdefiniowane w następujący sposób:

public enum class day {sun, mon };

i jest semantycznie równoważne:

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

Wyliczenie standardowe może być zdefiniowane w następujący sposób:

enum day2 { sun, mon };

i jest semantycznie równoważne:

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

Zarządzane nazwy modułów wyliczania (identyfikatory) nie są wstrzykiwane do zakresu, w którym zdefiniowano wyliczenie; wszystkie odwołania do modułów wyliczania muszą być w pełni kwalifikowane (identyfikator nazwy::). Z tego powodu nie można zdefiniować anonimowego wyliczenia zarządzanego.

Moduły wyliczające standardowego wyliczenia są silnie wstrzykiwane do otaczającego zakresu. Oznacza to, że jeśli istnieje inny symbol o takiej samej nazwie jak moduł wyliczający w otaczającym zakresie, kompilator wygeneruje błąd.

W programach Visual Studio 2002 i Visual Studio 2003 moduły wyliczające zostały słabo wprowadzone (widoczne w zakresie otaczającym, chyba że istnieje inny identyfikator o tej samej nazwie).

Jeśli standardowe wyliczenie języka C++ jest zdefiniowane (bez class lub struct), kompilowanie z elementem /clr spowoduje skompilowanie wyliczenia jako zarządzane wyliczenie. Wyliczenie nadal ma semantykę niezarządzanego wyliczenia. Należy pamiętać, że kompilator wprowadza atrybut, Microsoft::VisualC::NativeEnumAttribute aby zidentyfikować intencję programisty, aby wyliczenie było wyliczeniem natywnym. Inne kompilatory będą po prostu widzieć wyliczenie standardowe jako zarządzane wyliczenie.

Nazwane, standardowe wyliczenie skompilowane /clr za pomocą będzie widoczne w zestawie jako zarządzane wyliczenie i może być używane przez dowolny inny zarządzany kompilator. Nienazwany wyliczenie standardowe nie będzie jednak publicznie widoczne z zestawu.

W programach Visual Studio 2002 i Visual Studio 2003 standardowy wyliczenie używane jako typ w parametrze funkcji:

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

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

program emituje następujące elementy w MSIL dla podpisu funkcji:

void f(int32);

Jednak w bieżących wersjach kompilatora standardowe wyliczenie jest emitowane jako wyliczenie zarządzane z atrybutem [NativeEnumAttribute] i następujące elementy w języku MSIL dla podpisu funkcji:

void f(E)

Aby uzyskać więcej informacji na temat wyliczenia natywnych, zobacz Deklaracje wyliczenia języka C++.

Aby uzyskać więcej informacji na temat wyliczenia CLR, zobacz:

Wymagania

Opcja kompilatora: /clr

Przykłady

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

Zobacz też

Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows