Shoda jazyka Microsoft C/C++ podle Visual Studio verze
Článek
28 min ke čtení
Děkujeme.
Shoda se standardy kompilátoru C/C++ společnosti Microsoft Visual Studio (MSVC) je práce. Tady je souhrn naší shody jazyka a knihoven ISO Standard C a C++ podle Visual Studio verze. Každý kompilátor jazyka C++ a název funkce standardní knihovny odkazuje na dokument o návrhu standardu ISO C++, který popisuje funkci, pokud je k dispozici v době publikování. Sloupec Supported (Podporované) obsahuje Visual Studio, ve které se poprvé objevila podpora funkce.
V roce 2015, 2017, 2019 a 2022 se mezi Visual Studio 2015, 2017, 2019 a 2022 nehrodí žádné binární změny. Další informace najdete v tématu Binární kompatibilita C++ mezi Visual Studio verzemi.
Skupina popsaných dokumentů indikuje standardní funkci spolu s jedním nebo více schválenými vylepšeními nebo rozšířeními. Tyto funkce jsou implementovány společně.
Ne Ještě není naimplementované. Částečný Implementace je nekompletní. Další informace najdete v části poznámky . VS 2010 podporováno v Visual Studio 2010. VS 2013 Podporováno v Visual Studio 2013. VS 2015 podporováno v Visual Studio 2015 (RTW). vs 2015,2 a vs 2015,3 označují funkce podporované v Visual Studio 2015 update 2 a Visual Studio 2015 update 3 v uvedeném pořadí. VS 2017 15,0 podporované ve verzi Visual Studio 2017 15,0 (RTW). VS 2017 15,3 podporované ve verzi Visual Studio 2017 15,3. VS 2017 15,5 podporované ve verzi Visual Studio 2017 15,5. VS 2017 15,7 podporované ve verzi Visual Studio 2017 15,7. VS 2019 16,0 podporované ve verzi Visual Studio 2019 16,0 (RTW). VS 2019 16,1 podporované ve verzi Visual Studio 2019 16,1. VS 2019 16,2 podporované ve verzi Visual Studio 2019 16,2. VS 2019 16.3 Podporováno v Visual Studio 2019 verze 16.3. VS 2019 16.4 Podporováno v Visual Studio 2019 verze 16.4. VS 2019 16.5 Podporováno v Visual Studio 2019 verze 16.5. VS 2019 16.6 Podporováno v Visual Studio 2019 verze 16.6. VS 2019 16.7 Podporováno v Visual Studio 2019 verze 16.7. VS 2019 16.8 Podporováno v Visual Studio 2019 verze 16.8. VS 2019 16.9 Podporováno v Visual Studio 2019 verze 16.9. VS 2019 16.10 Podporováno v Visual Studio 2019 verze 16.10. VS 2022 17.0 Podporováno v Visual Studio 2022 verze 17.0.
Poznámky
dynamických výjimek v režimu zůstávají neimplementované a stále se s nimi /std:c++14throw() zachází jako se synonymem __declspec(nothrow) pro . V jazyce C++17 byly specifikace dynamických výjimek většinou odebrané funkcí P0003R5, takže jedna verze: je zastaralá a vyžaduje se, aby se chovala throw() jako synonymum pro noexcept . V režimu MSVC odpovídá standardu tím, že se vynucování prostřednictvím ukončení vynucování týká /std:c++17throw()noexcept stejného chování.
Možnost kompilátoru /Zc:noexceptTypes vyžaduje naše staré chování __declspec(nothrow) . Je pravděpodobné, že throw() bude odebrán v budoucí verzi jazyka C++. Pro pomoc s migrací kódu v reakci na tyto změny ve standardu a naší implementaci jsme do a přidali nová upozornění kompilátoru pro problémy se specifikací /std:c++17/permissive- výjimek.
podporováno /permissive- v režimu Visual Studio 2017 verze 15.7. Další informace najdete v tématu Podpora dvoufázovéhovyhledávání názvů na MSVC .
Počínaje Visual Studio 2019 verze 16.6 kompilátor plně implementuje preprocesor C99 prostřednictvím /Zc:preprocessor možnosti . (Před verzí 16.6 od verze Visual Studio 2017 verze 15.8 poskytuje kompilátor podporu preprocesoru C99 prostřednictvím možnosti /experimental:preprocessor kompilátoru.) Tato možnost je ve výchozím nastavení povolená, pokud je /std:c11/std:c17 zadána možnost kompilátoru nebo .
Podporováno /std:c++14 v rámci s potlačeným upozorněním C4984 .
Implementace je dostatečná pro podporu standardní knihovny C++20. Úplná implementace vyžaduje binární změnu, která narušuje zabezpečení.
odebrané, /std:c++17 když je zadána možnost kompilátoru nebo novější. Pokud chcete tyto funkce znovu povolit (pro usnadnění přechodu na novější jazykové režimy), použijte tato makra: _HAS_AUTO_PTR_ETC , _HAS_FUNCTION_ALLOCATOR_SUPPORT , a _HAS_OLD_IOSTREAMS_MEMBERS_HAS_UNEXPECTED .
paralelních algoritmů G C++17 je dokončená. Dokončení neznamená, že se každý algoritmus v každém případě paralelizuje. Nejdůležitější algoritmy byly paralelizovány a signatury zásad spouštění jsou poskytovány i tam, kde algoritmy paralelizovat nebudeme. Centrální interní hlavička naší implementace yvals_core.h obsahuje následující poznámky k paralelním algoritmům: Jazyk C++ umožňuje implementaci paralelních algoritmů jako volání <> sériových algoritmů. Tato implementace paralelizuje několik běžných volání algoritmu, ale ne všechna.
Tyto algoritmy nejsou v současné době paralelizovány:
U těchto algoritmů není patrné, že by se na cílovém hardwaru vylepšuje výkon paralelismu. Všechny algoritmy, které pouze kopírují nebo permutují prvky bez větví, mají obvykle omezenou šířku pásma paměti:
Jedná se o zcela novou implementaci nekompatibilní s předchozí verzí, kterou vyžadovala podpora symlinku, opravy chyb a změny ve std::experimental standardním požadovaném chování. V současné <filesystem> době poskytuje nový i předchozí std::filesystemstd::experimental::filesystem . Hlavička <experimental/filesystem> poskytuje pouze starou experimentální implementaci. Experimentální implementace bude odebrána v další verzi knihoven ABI, která je narušuje.
Podporováno vnitřní kompilátorem.
std::byte je povolené v nebo novějším, ale protože může být v konfliktu s hlavičkami sady Windows SDK v některých případech, má jemně odsouhlásit /std:c++17 makro. Pokud ho chcete zakázat, _HAS_STD_BYTE definujte jako 0 .
MSVC nepodporuje klíčové slovo ani nativní _Complex komplexní typy. Univerzální crt používá makra specifická pro implementaci k <complex.h> dosažení stejného efektu. Další informace najdete v tématu Podpora komplexní matematiky jazyka C.
Univerzální crt neimplementuje strftimeE modifikátory O alternativního převodu a . Tyto modifikátory jsou ignorovány (například %Oe se chová stejně jako %e ). Základní rozhraní API národního prostředí modifikátory nepodporují.
Universal CRT neimplementuje C11, aligned_alloc ale poskytuje a _aligned_malloc_aligned_free . Vzhledem k Windows operační systém nepodporuje zarovnané přidělení, je nepravděpodobné, že by byla tato funkce implementována.
Deklarace je odebrána, ale export funkce zůstává z důvodu zpětné kompatibility.
Některé funkce kontroly hranic jsou neimplementované, mají různé signatury nebo nejsou součástí standardu C11 nebo C17. Tyto funkce jsou neimplementované: abort_handler_s , , , , , , , ignore_handler_smemset_sset_constraint_handler_ssnprintf_ssnwprintf_sstrerrorlen_svsnwprintf_s . Tyto funkce mají různé signatury: gmtime_s , , , , , localtime_sqsort_sstrtok_svsnprintf_swcstok_s . Tyto funkce se ve standardu nezobrazují: clearerr_s , fread_s .
byla přidána ve VS 2019 16.10. Podpora pro Clang byla přidána ve VS 2022 17.0.
Odebere declare_reachable se , , , , undeclare_reachabledeclare_no_pointersundeclare_no_pointersget_pointer_safety . Dříve tyto funkce nemají žádný vliv.
Toto je běžná změna, která má narušovat zdroj. Kód, který dříve měl nedefinované chování za běhu, ale bude nyní odmítnut s chybami kompilátoru.
Část counted_iterator je implementovaná; část adaptérů vstupního rozsahu ještě není implementovaná.
<stdatomic.h> se aktuálně podporuje při kompilaci jako C++ ( /std:c++latest ). Při kompilaci jako C ( a ) zatím není /std:c11/std:c17 podporovaná.
Tyto funkce C++17 a C++20 jsou vždycky povolené, i když /std:c++14 je zadaný výchozí parametr. Důvodem je buď to, že funkce byla implementována před zavedením možností, nebo proto, že podmíněná implementace byla /std nežádoucím způsobem složitá.
Tyto funkce jsou povoleny možností /std:c++17 kompilátoru nebo novější.
Ve verzích Visual Studio 2019 verze 16.10 jsou tyto funkce povoleny možností /std:c++latest kompilátoru. Visual Studio 2019 verze 16.11 jsme přidali možnost kompilátoru /std:c++20 pro povolení těchto funkcí.
práce po vydání standardu C++20, jsou formátovací části nástroje (které se spoléhají na ) a rozsahové adaptéry od (vše, co tento koncept <format><chrono><format><ranges>view vyžaduje), /std:c++latest k dispozici pouze v části . Po dosažení smlouvy s WG21 tyto funkce z dostupných v rámci WG21 z dostupných možností, že už nejsou potřeba žádné další změny, které by /std:c++20 rušil ABI. Zbývající části a algoritmy, které se vztahují na rozsahy, jsou povoleny v rámci možnosti kompilátoru počínaje <chrono>/std:c++20 verzí 16.11 Visual Studio 2019.
V Visual Studio 2022 verze 17.0 a novější jsou tyto funkce povoleny možností /std:c++latest kompilátoru.
Podpora kompilátoru pro C11 a C17 vyžaduje Visual Studio 2019 verze 16.8 nebo novější. S výjimkou toho, co jsme si už připomeli, podpora knihoven C11 a C17 vyžaduje sestavení sady Windows SDK 10.0.20211.0 nebo vyšší. Další informace o tom, jak nainstalovat podporu pro C11 a C17, najdete v tématu Podpora instalace C11 a C17 v Visual Studio.
Tyto funkce jsou povolené ve všech režimech možností /std kompilátoru C++. Standardní rada C++ tuto změnu přijala jako retroaktivní zprávu o vadách pro C++11 a všechny novější verze.
Podpora knihovny C11 pro tuto funkci vyžaduje Windows SDK build 10.0.20348.0 (verze 2104) nebo novější.