/Zc:enumTypes
(Aktivieren des Enumerationstypabzugs)
Die /Zc:enumTypes
Compileroption ermöglicht C++-konformen enum
zugrunde liegenden Typ und Enumeratortypabzug.
Syntax
/Zc:enumTypes
[-
]
Hinweise
Die /Zc:enumTypes
Compileroption implementiert standard C++-konformes Verhalten für den Abzug von Enumerationsbasistypen und die Typen von Enumerationsenumeratoren.
Die /Zc:enumTypes
Option ist neu in Visual Studio 2022, Version 17.4. Diese Option ist standardmäßig deaktiviert und ist nicht aktiviert./permissive-
Verwenden Sie /Zc:enumTypes-
die Option, um die Option explizit zu deaktivieren.
Wenn die Option /Zc:enumTypes
aktiviert wird, stellt sie eine potenzielle Quelle für Breaking Changes in Binärdateien dar. Einige Enumerationstypen ändern die Größe, wenn die Konformitätsoption /Zc:enumTypes
aktiviert ist. Bestimmte Windows SDK-Header enthalten solche Enumerationsdefinitionen.
Der C++-Standard erfordert, dass der zugrunde liegende Typ einer Enumeration groß genug ist, um alle darin deklarierten Enumeratoren zu enthalten. Ausreichend große Enumeratoren können den zugrunde liegenden Typ von enum
auf unsigned int
, long long
oder unsigned long long
festlegen. Bisher hatten solche Enumerationstypen immer einen zugrunde liegenden Typ int
im Microsoft-Compiler, unabhängig von Enumeratorwerten.
Der C++-Standard gibt außerdem an, dass in einer Enumerationsdefinition, die keinen festen zugrunde liegenden Typ aufweist, die Typen von Enumerationen durch ihre Initialisierer bestimmt werden. Für Enumeratoren ohne Initialisierer kann der Typ des vorherigen Enumerators (unter Berücksichtigung eines Überlaufs) angenommen werden. Bisher erhielten solche Enumeratoren immer den abgeleiteten Typ der Enumeration mit einem Platzhalter für den zugrunde liegenden Typ (in der Regel int
).
In Visual Studio-Versionen vor Visual Studio 2022 Version 17.4 hat der C++-Compiler den zugrunde liegenden Typ einer Enumeration ohne eigenen Gültigkeitsbereich und ohne festen Basistyp nicht ordnungsgemäß ermittelt. Der Compiler hat auch die Typen von Enumerationen nicht richtig modelliert. Es konnte vorkommen, dass in Enumerationen ohne einen festen zugrunde liegenden Typ vor der schließende Klammer der Enumeration ein falscher Typ angenommen wurde. Unter /Zc:enumTypes
, der Compiler implementiert ordnungsgemäß das Standardverhalten.
Beispiel: Zugrunde liegender Typ nicht bereichslos enum
ohne festen Typ
enum Unsigned
{
A = 0xFFFFFFFF // Value 'A' does not fit in 'int'.
};
// Previously, this static_assert failed. It passes with /Zc:enumTypes.
static_assert(std::is_same_v<std::underlying_type_t<Unsigned>, unsigned int>);
template <typename T>
void f(T x)
{
}
int main()
{
// Previously called f<int>, now calls f<unsigned int>.
f(+A);
}
// Previously, this enum would have an underlying type of `int`,
// but Standard C++ requires this to have a 64-bit underlying type.
// The /Zc:enumTypes option changes the size of this enum from 4 to 8,
// which could impact binary compatibility with code compiled with an
// earlier compiler version, or without the switch.
enum Changed
{
X = -1,
Y = 0xFFFFFFFF
};
Beispiel: Enumeratoren innerhalb einer enum
Definition ohne festen zugrunde liegenden Typ
enum Enum {
A = 'A',
B = sizeof(A)
};
static_assert(B == 1); // previously failed, now succeeds under /Zc:enumTypes
In diesem Beispiel sollte der Enumerator A
vor der schließenden Klammer der Enumeration den Typ char
aufweisen. Daher sollte B
mit sizeof(char)
initialisiert werden. Vor der Korrektur von /Zc:enumTypes
hatte A
den Enumerationstyp Enum
mit dem abgeleiteten zugrunde liegenden Typ int
und B
wurde mit sizeof(Enum)
oder 4 initialisiert.
So legen Sie diese Compileroption in Visual Studio fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
Fügen Sie unter Zusätzliche Optionen
/Zc:enumTypes
oder/Zc:enumTypes-
hinzu. Wählen Sie OK oder Übernehmen, um die Änderungen zu speichern.
Weitere Informationen
/Zc
(Konformität)
/std
(Standardversion für die Sprache festlegen)