/Zc:enumTypes (Włącz odliczenie typu wyliczenia)

Opcja kompilatora /Zc:enumTypes umożliwia zgodność języka C++ z typem bazowym enum i potrąceniem typu wyliczającego.

Składnia

/Zc:enumTypes[-]

Uwagi

Opcja kompilatora /Zc:enumTypes implementuje zachowanie zgodne ze standardem C++ w celu odliczenia typów podstawowych wyliczenia i typów modułów wyliczających.

Opcja /Zc:enumTypes jest nowa w programie Visual Studio 2022 w wersji 17.4. Ta opcja jest domyślnie wyłączona i nie jest włączona przez /permissive-program . Aby jawnie wyłączyć tę opcję, użyj polecenia /Zc:enumTypes-.

Po włączeniu /Zc:enumTypes tej opcji jest potencjalna zmiana powodująca niezgodność źródła i danych binarnych. Niektóre typy wyliczenia zmieniają rozmiar po włączeniu zgodnej /Zc:enumTypes opcji. Niektóre nagłówki zestawu Windows SDK zawierają takie definicje wyliczenia.

Standard C++ wymaga, aby podstawowy typ wyliczenia był wystarczająco duży, aby przechowywać w nim wszystkie moduły wyliczające. Wystarczająco duże moduły wyliczania mogą ustawić bazowy typ enum elementu na unsigned int, long longlub unsigned long long. Wcześniej takie typy wyliczenia zawsze miały podstawowy typ int w kompilatorze firmy Microsoft, niezależnie od wartości modułu wyliczającego.

Standard C++ określa również, że w definicji wyliczenia, która nie ma stałego typu bazowego, typy modułów wyliczających są określane przez ich inicjatory. Lub dla modułów wyliczania bez inicjatora, według typu poprzedniego modułu wyliczającego (ewidencjonowanie przepełnienia). Wcześniej takie wyliczenia zawsze miały typ wyliczenia z symbolem zastępczym dla typu bazowego (zazwyczaj int).

W wersjach programu Visual Studio przed programem Visual Studio 2022 w wersji 17.4 kompilator języka C++ nie określił poprawnie bazowego typu wyliczenia niezakresowego bez stałego typu podstawowego. Kompilator również nie modeluje poprawnie typów modułów wyliczania. Można założyć, że nieprawidłowy typ w wyliczeniach bez stałego typu bazowego przed zamykającym nawiasem klamrowym wyliczenia. W obszarze /Zc:enumTypeskompilator prawidłowo implementuje standardowe zachowanie.

Przykład: Podstawowy typ niezakresowy enum bez stałego 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
};

Przykład: Moduły wyliczania w enum definicji bez stałego typu bazowego

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

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

W tym przykładzie moduł A wyliczający powinien mieć typ char przed zamykającym nawiasem klamrowym wyliczenia, więc B należy zainicjować przy użyciu polecenia sizeof(char). Przed poprawką /Zc:enumTypes miał A typ Enum wyliczenia z wydukowanym typem intbazowym , i B został zainicjowany przy użyciu , sizeof(Enum)lub 4.

Aby ustawić tę opcję kompilatora w programie Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. W obszarze Dodatkowe opcje dodaj /Zc:enumTypes lub /Zc:enumTypes-. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Zobacz też

/Zc (Zgodność)
/std (Określ wersję standardową języka)