Kesuaian bahasa Microsoft C/C++ berdasarkan versi Visual Studio
Artikel
Kesesuaian standar untuk pengompilasi Microsoft C/C++ di Visual Studio (MSVC) adalah pekerjaan yang sedang berlangsung. Berikut adalah ringkasan bahasa dan pustaka ISO Standar C dan C++ berdasarkan versi Visual Studio. Setiap pengompilasi C++ dan nama fitur pustaka standar memiliki tautan ke makalah proposal ISO Standar C++ yang menjelaskan fitur tersebut, ketika tersedia pada waktu publikasi. Kolom Didukung mencantumkan versi Visual Studio tempat dukungan untuk fitur tersebut pertama kali muncul.
Sekelompok makalah yang tercantum bersama menunjukkan fitur Standard bersama dengan satu atau beberapa penyempurnaan atau ekspansi yang disetujui. Fitur ini diimplementasikan bersama-sama.
Tidak Belum diimplementasikan. Parsial Implementasinya tidak lengkap. Untuk informasi selengkapnya, lihat bagian Catatan. VS 2010 Didukung pada Visual Studio 2010. VS 2013 Didukung pada Visual Studio 2013. VS 2015 Didukung pada Visual Studio 2015 (RTW). VS 2015.2 dan VS 2015.3 menunjukkan fitur yang didukung di pembaruan 2 Visual Studio 2015 dan Visual Studio 2015 Pembaruan 3, masing-masing. VS 2017 15.0 Didukung di Visual Studio 2017 versi 15.0 (RTW). VS 2017 15.3 Didukung di Visual Studio 2017 versi 15.3. VS 2017 15.5 Didukung di Visual Studio 2017 versi 15.5. VS 2017 15.7 Didukung di Visual Studio 2017 versi 15.7. VS 2019 16.0 Didukung di Visual Studio 2019 versi 16.0 (RTW). VS 2019 16.1 Didukung di Visual Studio 2019 versi 16.1. VS 2019 16.2 Didukung di Visual Studio 2019 versi 16.2. VS 2019 16.3 Didukung di Visual Studio 2019 versi 16.3. VS 2019 16.4 Didukung di Visual Studio 2019 versi 16.4. VS 2019 16.5 Didukung di Visual Studio 2019 versi 16.5. VS 2019 16.6 Didukung di Visual Studio 2019 versi 16.6. VS 2019 16.7 Didukung di Visual Studio 2019 versi 16.7. VS 2019 16.8 Didukung di Visual Studio 2019 versi 16.8. VS 2019 16.9 Didukung di Visual Studio 2019 versi 16.9. VS 2019 16.10 Didukung di Visual Studio 2019 versi 16.10. VS 2022 17.0 Didukung di Visual Studio 2022 versi 17.0. VS 2022 17.1 Didukung di Visual Studio 2022 versi 17.1. VS 2022 17.2 Didukung di Visual Studio 2022 versi 17.2. VS 2022 17.3 Didukung di Visual Studio 2022 versi 17.3. VS 2022 17.4 Didukung di Visual Studio 2022 versi 17.4. VS 2022 17.5 Didukung di Visual Studio 2022 versi 17.5.
Catatan
A Dalam /std:c++14 mode, spesifikasi pengecualian dinamis tetap tidak diterapkan, dan throw() masih diperlakukan sebagai sinonim untuk __declspec(nothrow). Dalam C++17, spesifikasi pengecualian dinamis sebagian besar dihapus oleh P0003R5, kecuali untuk satu vestige: throw() tidak digunakan lagi dan diperlukan untuk bertingkah sebagai sinonim untuk noexcept. Dalam mode /std:c++17, MSVC sekarang sesuai dengan Standard dengan memberikan throw() perilaku yang sama seperti noexcept, yaitu penegakan melalui penghentian.
Opsi pengompilasi /Zc:noexceptTypes meminta perilaku lama __declspec(nothrow). Kemungkinan throw() akan dihapus dalam versi C++yang akan datang. Untuk membantu migrasi kode sebagai respons terhadap perubahan ini dalam implementasi Standard dan Microsoft, peringatan pengompilasi baru untuk masalah spesifikasi pengecualian telah ditambahkan di bawah /std:c++17 dan /permissive-.
C Dalam Visual Studio 2019 versi 16.6 dan versi yang lebih baru, pengompilasi sepenuhnya mengimplementasikan praprosesor C99 standar melalui opsi/Zc:preprocessor. (Dalam Visual Studio 2017 versi 15.8 hingga 16.5, kompiler mendukung praprosesor C99 standar melalui opsi pengompilasi /experimental:preprocessor.) Opsi ini aktif secara default saat opsi pengompilasi /std:c11 atau /std:c17 ditentukan.
D Didukung di bawah /std:c++14 dengan peringatan yang dapat ditekan, C4984.
E Implementasinya cukup untuk mendukung Pustaka Standar C++20. Implementasi lengkap memerlukan perubahan pemecahan biner.
F Fitur dihapus saat opsi pengompilasi /std:c++17 atau yang lebih baru ditentukan. Untuk mengaktifkan kembali fitur-fitur ini (untuk memudahkan transisi ke mode bahasa yang lebih baru), gunakan makro ini: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS, dan _HAS_UNEXPECTED.
Pustaka algoritma paralel G C++17 selesai. Lengkap tidak berarti bahwa setiap algoritma disejajarkan dalam setiap kasus. Algoritma yang paling penting telah diparalelkan. Tanda tangan kebijakan eksekusi disediakan bahkan di mana implementasi tidak menyejajarkan algoritma. Header internal pusat, <yvals_core.h>, berisi "Catatan Algoritma Paralel" berikut: C++ memungkinkan implementasi untuk menerapkan algoritma paralel sebagai panggilan ke algoritma serial. Implementasi ini memparalelkan beberapa panggilan algoritma umum, tetapi tidak semua.
Algoritma ini tidak menunjukkan peningkatan performa paralelisme yang nyata pada perangkat keras target. Semua algoritma yang hanya menyalin atau memutus elemen tanpa cabang biasanya bandwidth memori terbatas:
H Ini adalah implementasi yang sama sekali baru, tidak kompatibel dengan versi std::experimental sebelumnya, yang diperlukan oleh dukungan symlink, perbaikan bug, dan perubahan perilaku yang diperlukan standar. Saat ini, <filesystem> menyediakan std::filesystem baru dan std::experimental::filesystem sebelumnya. Header <experimental/filesystem> hanya menyediakan implementasi eksperimental lama. Harapkan penghapusan implementasi eksperimental dalam rilis perpustakaan pemecah ABI berikutnya.
I Didukung oleh pengompilasi intrinsik.
Jstd::byte diaktifkan oleh /std:c++17 atau yang lebih baru, tetapi karena dapat bertentangan dengan header Windows SDK dalam beberapa kasus, ia memiliki makro penyisihan yang mendetail. Untuk menonaktifkannya, tentukan _HAS_STD_BYTE sebagai 0.
K MSVC tidak mendukung kata kunci _Complex atau jenis kompleks asli. Universal CRT <complex.h> menggunakan makro khusus implementasi untuk mencapai efek yang sama. Untuk informasi selengkapnya, lihat dukungan matematika kompleks C.
L Universal CRT tidak menerapkan strftimeE dan pengubah konversi alternatif O. Pengubah ini diabaikan (misalnya, %Oe bersifat sama seperti %e). Pengubah tidak didukung oleh API lokal yang mendasar.
M Universal CRT tidak mengimplementasikan C11 aligned_alloc, tetapi memberikan _aligned_malloc dan _aligned_free. Karena sistem operasi Windows tidak mendukung alokasi yang selaras, fungsi ini tidak mungkin diimplementasikan.
N Deklarasi dihapus, tetapi ekspor untuk fungsi tetap untuk kompatibilitas mundur.
O Fungsi pemeriksaan batas tertentu tidak diterapkan, atau memiliki tanda tangan yang berbeda, atau bukan bagian dari standar C11 atau C17. Fungsi ini tidak diimplementasikan: abort_handler_s, ignore_handler_s, memset_s, set_constraint_handler_s, snprintf_s, snwprintf_s, strerrorlen_s, vsnwprintf_s. Fungsi ini memiliki tanda tangan berbeda: gmtime_s, localtime_s, qsort_s, strtok_s, vsnprintf_s, wcstok_s. Fungsi ini tidak muncul di standar: clearerr_s, fread_s.
P Dukungan ditambahkan di Visual Studio 2019 versi 16.10. Dukungan untuk Clang ditambahkan dalam Visual Studio 2022 versi 17.0.
Q Ini menghapus declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers, get_pointer_safety. Sebelumnya, fungsi-fungsi ini tidak berpengaruh.
R Ini adalah perubahan pemecahan sumber umum. Namun, kode yang sebelumnya memiliki perilaku yang tidak terdefinisi pada runtime sekarang ditolak dengan kesalahan pengompilasi.
S Adaptor rentang input dan counted_iterator diimplementasikan di VS 2022 17.0. Pembaruan mendatang untuk Visual Studio 2019 versi 16.11 direncanakan untuk menggabungkan perubahan ini.
T<stdatomic.h> saat ini didukung saat dikompilasi sebagai C++ (/std:c++latest). Ini belum didukung ketika dikompilasi sebagai C (/std:c11 dan /std:c17)
14 Fitur C++17 dan C++20 ini selalu diaktifkan, bahkan ketika /std:c++14 (default) ditentukan. Alasannya adalah karena fitur diimplementasikan sebelum pengenalan opsi /std, atau karena implementasi bersyarat sangat rumit.
17 Fitur-fitur ini diaktifkan oleh /std:c++17 atau opsi pengompilasi yang lebih baru.
20 Dalam versi melalui Visual Studio 2019 versi 16.10, fitur ini diaktifkan oleh opsi pengompilasi /std:c++latest. Visual Studio 2019 versi 16.11 menambahkan opsi pengompilasi /std:c++20 untuk mengaktifkan fitur-fitur ini.
20abi Karena pekerjaan pascarilis yang sedang berlangsung pada standar C++20, <format>, bagian pemformatan <chrono> (yang bergantung pada <format>), dan berbagai pabrik serta adaptor rentang dari <ranges> (semua yang memerlukan konsep view) hanya tersedia di bawah /std:c++latest. Harapkan fitur ini di bawah /std:c++20 setelah kesepakatan dicapai dengan WG21 bahwa tidak diperlukan perubahan lebih lanjut yang melanggar ABI. Bagian <chrono> yang tersisa dan algoritme yang berlaku untuk rentang diaktifkan di bawah opsi pengompilasi /std:c++20 di Visual Studio 2019 versi 16.11 dan versi yang lebih baru.
23 Di Visual Studio 2022 versi 17.0 dan yang lebih baru, fitur ini diaktifkan oleh opsi pengompilasi /std:c++latest.
C11 Dukungan kompiler untuk C11 dan C17 memerlukan Visual Studio 2019 versi 16.8 atau lebih tinggi. Kecuali seperti yang disebutkan, dukungan pustaka C11 dan C17 memerlukan Windows SDK build 10.0.20211.0 atau lebih tinggi. Untuk informasi selengkapnya tentang cara memasang dukungan untuk C11 dan C17, lihat Menginstal dukungan C11 dan C17 di Visual Studio.
DR Fitur ini diaktifkan di semua mode opsi pengompilasi C++ /std. Komite Standar C++ mengadopsi perubahan ini sebagai Laporan Cacat retroaktif ke C++ 11 dan semua versi yang lebih baru.
2104 Dukungan pustaka C11 untuk fitur ini memerlukan Windows SDK build 10.0.20348.0 (versi 2104) atau lebih tinggi.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat: https://aka.ms/ContentUserFeedback.