Sdílet prostřednictvím


/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 inthodnoty , long longnebo 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:enumTypesKompilá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 inta B byl inicializován pomocí sizeof(Enum)nebo 4.

Nastavení této možnosti kompilátoru v sadě Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.

  3. V dalších možnostech přidejte /Zc:enumTypes nebo /Zc:enumTypes-. Změny uložíte kliknutím na OK nebo Použít .

Viz také

/Zc (Shoda)
/std (Určení standardní verze jazyka)