/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 longolarak temel alınan türünü long longenum unsigned intayarlayabilir. 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 intsahipti ve B veya 4 kullanılarak sizeof(Enum)başlatıldı.

Visual Studio'da bu derleyici seçeneğini ayarlamak için

  1. Projenin Özellik Sayfaları iletişim kutusunu açın. Ayrıntılar için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.

  3. Ek seçenekler'de veya /Zc:enumTypes-ekleyin/Zc:enumTypes. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.

Ayrıca bkz.

/Zc (Uyumluluk)
/std (Dil standart sürümünü belirtin)