/Zc:enumTypes
(Numaralandırma türü kesintisini etkinleştir)
Derleyici /Zc:enumTypes
seçeneği, C++ uyumlu enum
temel türü ve numaralandırıcı türü kesintisini etkinleştirir.
Sözdizimi
/Zc:enumTypes
[-
]
Açıklamalar
Derleyici /Zc:enumTypes
seçeneği, numaralandırma temel türlerinin ve numaralandırıcı türlerinin düşülmesi için Standart C++ uyumlu davranışı uygular.
Bu /Zc:enumTypes
seçenek Visual Studio 2022 sürüm 17.4'te yenidir. Bu seçenek varsayılan olarak kapalıdır ve tarafından /permissive-
etkinleştirilmez. seçeneğini açıkça devre dışı bırakmak için kullanın /Zc:enumTypes-
.
Etkinleştirildiğinde, /Zc:enumTypes
seçenek olası bir kaynak ve ikili hataya neden olan değişikliktir. Uyumlu /Zc:enumTypes
seçenek etkinleştirildiğinde bazı numaralandırma türleri boyutu değiştirir. Bazı Windows SDK üst bilgileri bu tür numaralandırma tanımlarını içerir.
C++ Standardı, bir numaralandırmanın temel alınan türünün, içinde bildirilen tüm numaralandırıcıları barındıracak kadar büyük olmasını gerektirir. Yeterince büyük numaralandırıcılar , veya unsigned long long
olarak temel alınan türünü long long
enum
unsigned int
ayarlayabilir. Daha önce, numaralandırma değerlerinden bağımsız olarak, bu tür numaralandırma türlerinin Microsoft derleyicisinde her zaman bir temel türü int
vardı.
C++ Standardı, sabit bir temel türü olmayan bir numaralandırma tanımında, numaralandırıcı türlerinin başlatıcıları tarafından belirlendiğini de belirtir. Veya başlatıcısı olmayan numaralandırıcılar için, önceki numaralandırıcının türüne göre (taşma ekleyerek). Daha önce, bu tür numaralandırıcılara her zaman temel alınan tür için bir yer tutucuyla (genellikle int
) numaralandırmanın çıkarılmış türü verilirdi.
Visual Studio'nun Visual Studio 2022 sürüm 17.4'den önceki sürümlerinde, C++ derleyicisi sabit temel türü olmayan temel alınmamış bir numaralandırmanın temel türünü doğru şekilde belirlemedi. Derleyici ayrıca numaralandırıcı türlerini doğru şekilde modellemedi. Sabit sabit listesi kapanış ayracı öncesinde sabit bir temel türü olmayan numaralandırmalarda yanlış bir tür varsayılabilir. altında /Zc:enumTypes
, derleyici standart davranışı doğru şekilde uygular.
Örnek: Sabit türü olmayan temel alınan kapsamsız enum
türü
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
};
Örnek: Sabit temel türü olmayan bir enum
tanım içindeki numaralandırıcılar
enum Enum {
A = 'A',
B = sizeof(A)
};
static_assert(B == 1); // previously failed, now succeeds under /Zc:enumTypes
Bu örnekte numaralandırıcı A
, numaralandırmanın kapanış ayracından önce türüne char
sahip olmalıdır, bu nedenle B
kullanılarak sizeof(char)
başlatılmalıdır. Düzeltmeden /Zc:enumTypes
önce, A
temel alınan türü çıkarılmış olan sabit listesi türüne Enum
int
sahipti ve B
veya 4 kullanılarak sizeof(Enum)
başlatıldı.
Visual Studio'da bu derleyici seçeneğini ayarlamak için
Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.
Ek seçenekler'de veya
/Zc:enumTypes-
ekleyin/Zc:enumTypes
. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.