/Zc:enumTypes
(Povolení odpočtu typu výčtu)
Možnost /Zc:enumTypes
kompilátoru umožňuje odpočtu typu enumerátoru v jazyce C++ odpovídající enum
základnímu typu a výčtu.
Syntaxe
/Zc:enumTypes
[-
]
Poznámky
Možnost kompilátoru /Zc:enumTypes
implementuje standardní C++ odpovídající chování pro odpočet základních typů výčtu a typů výčtů.
Tato /Zc:enumTypes
možnost je nová v sadě Visual Studio 2022 verze 17.4. Tato možnost je ve výchozím nastavení vypnutá a není povolená ./permissive-
Pokud chcete tuto možnost explicitně zakázat, použijte /Zc:enumTypes-
.
Pokud je tato možnost povolená, /Zc:enumTypes
jedná se o potenciální zdrojovou a binární zásadní změnu. Některé typy výčtů mění velikost při povolení odpovídající /Zc:enumTypes
možnosti. Některé hlavičky sady Windows SDK zahrnují takové definice výčtu.
Standard jazyka C++ vyžaduje, aby byl základní typ výčtu dostatečně velký, aby v něm byly všechny výčty deklarované. Dostatečně velké výčty mohou nastavit základní typ enum
unsigned int
hodnoty , long long
nebo unsigned long long
. Dříve tyto typy výčtu měly vždy základní typ int
v kompilátoru Microsoftu bez ohledu na hodnoty enumerátoru.
Standard C++ také určuje, že v rámci definice výčtu, který nemá žádný pevný základní typ, jsou typy výčtů určeny jejich inicializátory. Nebo pro enumerátory bez inicializátoru podle typu předchozího enumerátoru (účetující přetečení). Dříve byly tyto výčty vždy dány vyvolaným typem výčtu se zástupným symbolem pro základní typ (obvykle int
).
Ve verzích sady Visual Studio před sadou Visual Studio 2022 verze 17.4 kompilátor jazyka C++ neurčil správně základní typ neskopovaného výčtu bez pevného základního typu. Kompilátor také nemodeloval správně typy enumerátorů. Před pravou závorkou výčtu by se mohl předpokládat nesprávný typ výčtu bez pevného podkladového typu. V části /Zc:enumTypes
Kompilátor správně implementuje standardní chování.
Příklad: Základní typ bez pevného typu bez enum
pevného typu
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
};
Příklad: Enumerátory v definici enum
bez pevného podkladového typu
enum Enum {
A = 'A',
B = sizeof(A)
};
static_assert(B == 1); // previously failed, now succeeds under /Zc:enumTypes
V tomto příkladu by měl enumerátor A
mít typ char
před pravou složenou závorkou výčtu, takže B
by měl být inicializován pomocí sizeof(char)
. Před opravou /Zc:enumTypes
A
měl typ Enum
výčtu s vyvolaným základním typem int
a B
byl inicializován pomocí sizeof(Enum)
nebo 4.
Nastavení této možnosti kompilátoru v sadě Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.
V dalších možnostech přidejte
/Zc:enumTypes
nebo/Zc:enumTypes-
. Změny uložíte kliknutím na OK nebo Použít .