enum class (C++ Component Extensions)

Deklaruje typ wyliczeniowy w zakresie przestrzeni nazw, który jest zdefiniowanym przez użytkownika typem składającym się z zestawu nazwanych stałych zwanych wyliczeniami.

Wszystkie środowiska wykonawcze

Uwagi

C++/CX i C++/CLI wspierają public enum class i private enum class które są podobne do standardowych typów wyliczeniowych enum class, ale z dodanym specyfikatorem dostępu.Pod /clr, typ enum class C++ 11 jest dozwolony, ale generuje ostrzeżenie C4472, które ma na celu zapewnienie, że naprawdę potrzebny jest typ wyliczeniowy ISO, a nie typ C++/CX i C++/CLI.Aby uzyskać więcej informacji dotyczących standardu ISO enum języka C++, zobacz Deklaracje modułów wyliczających języka C++.

Środowisko wykonawcze systemu Windows

Składnia

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

Parametry

  • access
    Dostępność enumeracji, która może być public lub private.

  • enumeration-identifier
    Nazwa wyliczenia.

  • underlying-type
    (Opcjonalnie) Leżący u podstaw typ enumeracji.

    (Opcjonalnie.tylko Środowisko wykonawcze systemu Windows) podlegający typ enumeracji, którym może być bool, char, char16, int16, uint16, int, uint32, int64 lub uint64.

  • enumerator-list
    Rozdzielana przecinkami lista nazw moduł wyliczający.

    Wartość każdego modułu wyliczającego jest wyrażenie stałe, zdefiniowanemu albo niejawnie przez kompilator, albo jawnie notacji, enumerator=constant-expression. Domyślnie wartość pierwszego modułu wyliczającego wynosi zero, jeśli nie jest pośrednio zdefiniowana.Wartością każdego kolejnego modułu wyliczającego zdefiniowanego niejawnie jest wartość poprzedniego modułu wyliczającego + 1.

  • var
    (Opcjonalnie) Nazwa zmiennej typu enumeracji.

Uwagi

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

Należy zauważyć, że kompilator emituje komunikaty o błędach, jeśli stała wyrażenie, które definiuje wartość moduł wyliczający nie może być reprezentowana przez underlying-type. Jednak kompilator nie zgłasza błędu dotyczącego wartości, która jest nieodpowiednia dla podstawowego typu.Na przykład:

  • Jeśli underlying-type jest liczbą i moduł wyliczający określa maksymalną wartość dla tego typu, nie może być przedstawiona wartość następnego niejawnie zdefiniowanych enumeratoin.

  • Jeśli underlying-type jest bool, i więcej niż dwa moduły wyliczające są jawnie zdefiniowane, moduły wyliczające po dwóch pierwszych nie może być przedstawiona.

  • Jeśli underlying-type jest char16, a wartość wyliczenia dla zakresu od 0xD800 do 0xDFFF, wartość może być reprezentowana.Jednakże wartość jest logicznie niepoprawna, ponieważ reprezentuje ona pół zastępcze pary Unicode i nie powinna być wyświetlana sama.

Wymagania

Opcja kompilatora: /ZW

Środowisko uruchomieniowe języka wspólnego

Składnia

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

Parametry

  • access
    Dostępność typu enum. Mogą być albo publiczny albo private.

  • enumerator-list
    Rozdzielana przecinkami lista identyfikatorów (moduły wyliczające) w wyliczeniu.

  • name
    Nazwa wyliczenia. Anonimowe wyliczenia zarządzane nie są dozwolone.

  • type (opcjonalnie)
    Podlegający typ identyfikatorów. Może to być każdy typ skalarny, taki jak wersje int, short lub long ze znakiem lub bez. bool lub char również są dozwolone.

  • var (opcjonalnie)
    Nazwa zmiennej typu enumeracji.

Uwagi

Wylicz klasy i wylicz struktury to równoważne deklaracje.

Istnieją dwa typy typów wyliczeniowych: zarządzany lub C++/CX i standardowy.

Zarządzany typ wyliczeniowy lub C++/CX można zdefiniować 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;
};

Standardowe wyliczenie można zdefiniować 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 wyliczenia (identyfikatorów) nie są dodawane do zakresu, w którym zdefiniowano wyliczenie; wszystkie odniesienia do modułów wyliczających muszą być w pełni kwalifikowane (Nazwa::identyfikatora). Z tego powodu nie można zdefiniować anonimowego zarządzanego wyliczenia.

Moduły wyliczające standardowego typu enum są zdecydowanie włączane w zawierający je zakres. To znaczy, że jeśli istnieje inny symbol z taką samą nazwą, jak moduł wyliczający w danym kontekście, wówczas kompilator wygeneruje błąd.

W Visual C++ 2002 i Visual C++ 2003 moduły wyliczające były słabo wprowadzone (widoczne w zawartym zasięgu, chyba że wystąpił inny identyfikator o tej samej nazwie).

Jeśli zdefiniowano standardowy typ wyliczeniowy C++ (bez class lub struct), kompilowanie /clr spowoduje, że typ wyliczeniowy zostanie skompilowany jako zarządzany typ wyliczeniowy. Enumeracja nadal ma semantykę enumeracji niezarządzanej. Należy zauważyć, że kompilator wstawia atrybut [Microsoft::VisualC::NativeEnumAttribute], rozpoznawany przez kompilator Visual C++ w celu oznaczenia intencji programisty, by typ wyliczeniowy stanowił natywny typ wyliczeniowy. Inne kompilatory po prostu zobaczą standardowy enum jako zarządzany enum.

Nazwane, standardowe wyliczenie skompilowane z/CLR będą widoczne w zestawie jako zarządzane wyliczenia i mogą być używane przez każdy inny zarządzany kompilator. Jednak nienazwane wyliczenia standardowe nie będą widoczne publicznie z zestawu.

W Visual C++ 2002 i Visual C++ 2003, standardowe wyliczenie używane jako typ parametru 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);
}

będzie wysyłać w MSIL następujące wyniki dla podpisu funkcji:

void f(int32);

Jednak w obecnej wersji kompilatora, standardowe wyliczenie jest emitowane jako wyliczenie zarządzane za pomocą [Macierzysty atrybut wyliczenia] i następujące w MSIL dla podpisu funkcji:

void f(E)

Aby uzyskać więcej informacji na temat wyliczeń macierzystych, zobacz Deklaracje wyliczeń C++.

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

Wymagania

Opcja kompilatora: /clr

Przykłady

Przykład

malejąco

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

Dane wyjściowe

  
  
  
  

Zobacz też

Koncepcje

Component Extensions dla platform środowiska uruchomieniowego