/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 long
lub 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:enumTypes
kompilator 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 int
bazowym , i B
został zainicjowany przy użyciu , sizeof(Enum)
lub 4.
Aby ustawić tę opcję kompilatora w programie Visual Studio
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).
Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.
W obszarze Dodatkowe opcje dodaj
/Zc:enumTypes
lub/Zc:enumTypes-
. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.