/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 long
o 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 int
genere ).
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:enumTypes
il 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 int
sottostante dedotto ed B
è stato inizializzato usando sizeof(Enum)
, o 4.
Per impostare questa opzione del compilatore in Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.
Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.
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)