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