/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

  1. Ö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).

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. 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)