Bagikan melalui


/Zc:enumTypes (Aktifkan pengurangan jenis enum)

Opsi /Zc:enumTypes pengkompilasi memungkinkan C++ menyesuaikan enum jenis dasar dan pengurangan jenis enumerator.

Sintaks

/Zc:enumTypes[-]

Keterangan

Opsi /Zc:enumTypes kompilator mengimplementasikan perilaku sesuai Standard C++ untuk pengurangan jenis dasar enumerasi dan jenis enumerator.

Opsi /Zc:enumTypes ini baru di Visual Studio 2022 versi 17.4. Opsi ini nonaktif secara default, dan tidak diaktifkan oleh /permissive-. Untuk menonaktifkan opsi secara eksplisit, gunakan /Zc:enumTypes-.

Saat diaktifkan, /Zc:enumTypes opsi adalah sumber potensial dan perubahan pemecahan biner. Beberapa jenis enumerasi berubah ukuran saat opsi sesuai /Zc:enumTypes diaktifkan. Header Windows SDK tertentu menyertakan definisi enumerasi tersebut.

Standar C++ mengharuskan bahwa jenis enumerasi yang mendasar cukup besar untuk menahan semua enumerator yang dinyatakan di dalamnya. Enumerator yang cukup besar dapat mengatur jenis yang enum mendasar ke unsigned int, , long longatau unsigned long long. Sebelumnya, jenis enumerasi seperti itu selalu memiliki jenis int yang mendasar dalam pengkompilasi Microsoft, terlepas dari nilai enumerator.

Standar C++ juga menentukan bahwa, dalam definisi enumerasi yang tidak memiliki jenis dasar tetap, jenis enumerator ditentukan oleh penginisialisasinya. Atau, untuk enumerator tanpa inisialisasi, dengan jenis enumerator sebelumnya (memperhitungkan luapan). Sebelumnya, enumerator tersebut selalu diberi jenis enumerasi yang disimpulkan, dengan tempat penampung untuk jenis yang mendasar (biasanya int).

Dalam versi Visual Studio sebelum Visual Studio 2022 versi 17.4, pengkompilasi C++ tidak menentukan dengan benar jenis enumerasi yang tidak terlingkup dengan benar tanpa jenis dasar tetap. Pengkompilasi juga tidak memodelkan jenis enumerator dengan benar. Ini dapat mengasumsikan jenis yang salah dalam enumerasi tanpa jenis yang mendasar tetap sebelum kurung kurawal penutup enumerasi. Di bawah /Zc:enumTypes, pengkompilasi mengimplementasikan perilaku standar dengan benar.

Contoh: Jenis yang mendasar tidak terlingkup enum tanpa jenis tetap

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
};

Contoh: Enumerator dalam enum definisi tanpa jenis dasar tetap

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

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

Dalam contoh ini enumerator A harus memiliki jenis char sebelum kurung kurawal penutup enumerasi, jadi B harus diinisialisasi menggunakan sizeof(char). /Zc:enumTypes Sebelum perbaikan, A memiliki jenis Enum enumerasi dengan jenis intyang mendasar yang disimpulkan , dan B diinisialisasi menggunakan sizeof(Enum), atau 4.

Untuk mengatur opsi pengkompilasi ini di Visual Studio

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.

  3. Di Opsi tambahan, tambahkan /Zc:enumTypes atau /Zc:enumTypes-. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.

Baca juga

/Zc (Kesuaian)
/std (Tentukan versi standar bahasa)