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
, int
uint16
uint32
int16
int64
lub .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. Na 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
, short
lub 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