Share via


/Zc:enumTypes (Abilitare la deduzione del tipo di enumerazione)

L'opzione /Zc:enumTypes del compilatore abilita la deduzione del enum tipo e dell'enumeratore sottostante conforme a C++.

Sintassi

/Zc:enumTypes[-]

Osservazioni:

L'opzione /Zc:enumTypes del compilatore implementa il comportamento conforme allo standard C++ per la deduzione dei tipi di base di enumerazione e dei tipi di enumeratori.

L'opzione /Zc:enumTypes è una novità di Visual Studio 2022 versione 17.4. Questa opzione è disattivata per impostazione predefinita e non è abilitata da /permissive-. Per disabilitare in modo esplicito l'opzione , usare /Zc:enumTypes-.

Se abilitata, l'opzione /Zc:enumTypes è una potenziale modifica di origine e di interruzione binaria. Alcuni tipi di enumerazione modificano le dimensioni quando l'opzione conforme /Zc:enumTypes è abilitata. Alcune intestazioni di Windows SDK includono tali definizioni di enumerazione.

Lo standard C++ richiede che il tipo sottostante di un'enumerazione sia sufficientemente grande da contenere tutti gli enumeratori dichiarati. Gli enumeratori sufficientemente grandi possono impostare il tipo sottostante di enum su unsigned int, long longo unsigned long long. In precedenza, tali tipi di enumerazione avevano sempre un tipo sottostante di int nel compilatore Microsoft, indipendentemente dai valori dell'enumeratore.

Lo standard C++ specifica inoltre che, all'interno di una definizione di enumerazione senza tipo sottostante fisso, i tipi di enumeratori vengono determinati dai relativi inizializzatori. In alternativa, per gli enumeratori senza inizializzatore, per il tipo dell'enumeratore precedente (che rappresenta l'overflow). In precedenza, tali enumeratori venivano sempre assegnati al tipo dedotto dell'enumerazione, con un segnaposto per il tipo sottostante (in intgenere ).

Nelle versioni di Visual Studio precedenti a Visual Studio 2022 versione 17.4, il compilatore C++ non ha determinato correttamente il tipo sottostante di un'enumerazione senza ambito senza tipo di base fisso. Il compilatore non ha anche modellato correttamente i tipi di enumeratori. Potrebbe presupporre un tipo non corretto nelle enumerazioni senza un tipo sottostante fisso prima della parentesi graffa di chiusura dell'enumerazione. In /Zc:enumTypesil compilatore implementa correttamente il comportamento standard.

Esempio: tipo sottostante di senza enum ambito senza tipo fisso

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

Esempio: Enumeratori all'interno di una enum definizione senza tipo sottostante fisso

enum Enum {
    A = 'A',
    B = sizeof(A)
};

static_assert(B == 1); // previously failed, now succeeds under /Zc:enumTypes

In questo esempio l'enumeratore A deve avere un tipo char prima della parentesi graffa di chiusura dell'enumerazione, pertanto B deve essere inizializzato usando sizeof(char). Prima della correzione, A aveva un /Zc:enumTypes tipo Enum di enumerazione con un tipo intsottostante dedotto ed B è stato inizializzato usando sizeof(Enum), o 4.

Per impostare questa opzione del compilatore in Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.

  3. In Opzioni aggiuntive aggiungere /Zc:enumTypes o /Zc:enumTypes-. Scegliere OK o Applica per salvare le modifiche.

Vedi anche

/Zc (Conformità)
/std (Specificare la versione standard della lingua)