Conformità del linguaggio Microsoft C/C++ dalla versione di Visual Studio
Articolo
La conformità agli standard per il compilatore Microsoft C/C++ in Visual Studio (MSVC) è un lavoro in corso. Ecco un riepilogo della conformità del linguaggio e della libreria ISO Standard C e C++ in base alla versione di Visual Studio. Ogni compilatore C++ e il nome della funzionalità della libreria standard hanno un collegamento al documento di proposta C++ standard ISO che descrive la funzionalità, quando ne è disponibile uno in fase di pubblicazione. Nella colonna Supportato è elencata la versione di Visual Studio in cui è stato visualizzato il supporto per la funzionalità.
VS 2019 16.5. Per garantire una migliore compatibilità con le versioni precedenti, __VA_OPT__ è abilitata /Zc:preprocessor in tutte le versioni del linguaggio.
Un elenco più dettagliato delle funzionalità della libreria standard e delle correzioni di bug in base alla versione del prodotto è disponibile nella pagina del log delle modifiche wiki di Microsoft STL di GitHub.
Un gruppo di documenti elencati insieme indica una funzionalità Standard insieme a uno o più miglioramenti o espansioni approvati. Queste funzionalità vengono implementate insieme.
Nessuna implementazione non ancora implementata. Partial L'implementazione è incompleta. Per altre informazioni, vedere la sezione Note . Visual Studio 2010 supportato in Visual Studio 2010. Visual Studio 2013 supportato in Visual Studio 2013. VS 2015 supportato in Visual Studio 2015 (RTW). VS 2015.2 e VS 2015.3 indicano le funzionalità supportate rispettivamente in Visual Studio 2015 Update 2 e Visual Studio 2015 Update 3. VS 2017 15.0 Supportato in Visual Studio 2017 versione 15.0 (RTW). VS 2017 15.3 Supportato in Visual Studio 2017 versione 15.3. VS 2017 15.5 Supportato in Visual Studio 2017 versione 15.5. VS 2017 15.7 Supportato in Visual Studio 2017 versione 15.7. VS 2019 16.0 Supportato in Visual Studio 2019 versione 16.0 (RTW). VS 2019 16.1 Supportato in Visual Studio 2019 versione 16.1. VS 2019 16.2 Supportato in Visual Studio 2019 versione 16.2. VS 2019 16.3 Supportato in Visual Studio 2019 versione 16.3. VS 2019 16.4 Supportato in Visual Studio 2019 versione 16.4. VS 2019 16.5 Supportato in Visual Studio 2019 versione 16.5. VS 2019 16.6 Supportato in Visual Studio 2019 versione 16.6. VS 2019 16.7 Supportato in Visual Studio 2019 versione 16.7. VS 2019 16.8 Supportato in Visual Studio 2019 versione 16.8. VS 2019 16.9 Supportato in Visual Studio 2019 versione 16.9. VS 2019 16.10 Supportato in Visual Studio 2019 versione 16.10. VS 2022 17.0 Supportato in Visual Studio 2022 versione 17.0. VS 2022 17.1 Supportato in Visual Studio 2022 versione 17.1. VS 2022 17.2 Supportato in Visual Studio 2022 versione 17.2. VS 2022 17.3 Supportato in Visual Studio 2022 versione 17.3. VS 2022 17.4 Supportato in Visual Studio 2022 versione 17.4. VS 2022 17.5 Supportato in Visual Studio 2022 versione 17.5.
Note
Un In /std:c++14 modalità, le specifiche delle eccezioni dinamiche rimangono non implementate e throw() vengono comunque considerate come sinonimi di __declspec(nothrow). In C++17 le specifiche delle eccezioni dinamiche sono state rimosse principalmente da P0003R5, ad eccezione di una vestigia: throw() è deprecata e deve comportarsi come sinonimo di noexcept. In /std:c++17 modalità, MSVC ora è conforme allo standard assegnando throw() lo stesso comportamento di noexcept, ovvero l'imposizione tramite terminazione.
L'opzione /Zc:noexceptTypes del compilatore richiede il comportamento precedente di __declspec(nothrow). È probabile che throw() venga rimosso in una versione futura di C++. Per semplificare la migrazione del codice in risposta a queste modifiche nell'implementazione Standard e Microsoft, vengono aggiunti nuovi avvisi del compilatore per i problemi di specifica delle eccezioni in /std:c++17 e /permissive-.
C In Visual Studio 2019 versione 16.6 e versioni successive il compilatore implementa completamente il preprocessore C99 standard tramite l'opzione /Zc:preprocessor . In Visual Studio 2017 versioni da 15.8 a 16.5 il compilatore supporta il preprocessore C99 standard tramite l'opzione del /experimental:preprocessor compilatore. Questa opzione è attivata per impostazione predefinita quando si specifica l'opzione /std:c11 del compilatore o /std:c17 .
D Supportato in /std:c++14 con un avviso soppressibile, C4984.
E L'implementazione è sufficiente per supportare la libreria standard C++20. Un'implementazione completa richiede una modifica di rilievo binaria.
F Funzionalità rimosse quando viene specificata l'opzione del /std:c++17 compilatore o versione successiva. Per riabilitare queste funzionalità (per semplificare la transizione alle modalità del linguaggio più recenti), usare queste macro: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERSe _HAS_UNEXPECTED.
G La libreria di algoritmi paralleli di C++17 è completa. Il completamento non significa che ogni algoritmo sia parallelizzato in ogni caso. Gli algoritmi più importanti sono stati parallelizzati. Le firme dei criteri di esecuzione vengono fornite anche quando l'implementazione non parallelizza gli algoritmi. L'intestazione interna centrale, <yvals_core.h>, contiene le seguenti "Note algoritmi paralleli": C++ consente a un'implementazione di implementare algoritmi paralleli come chiamate agli algoritmi seriali. Con questa implementazione è possibile eseguire la parallelizzazione di diverse chiamate di algoritmi comuni, ma non di tutti.
Questi algoritmi non sono attualmente parallelizzati:
Questi algoritmi non mostrano miglioramenti evidenti delle prestazioni di parallelismo nell'hardware di destinazione. Tutti gli algoritmi che copiano o permutano semplicemente gli elementi senza rami sono in genere limitati per la larghezza di banda di memoria:
H Si tratta di un'implementazione completamente nuova, incompatibile con la versione precedentestd::experimental, resa necessaria dal supporto simbolico, correzioni di bug e modifiche nel comportamento richiesto standard. Attualmente, <filesystem> fornisce sia il nuovo std::filesystem che il precedente std::experimental::filesystem. L'intestazione <experimental/filesystem> fornisce solo l'implementazione sperimentale precedente. È prevista la rimozione dell'implementazione sperimentale nella prossima versione di interruzione ABI delle librerie.
Io Supportato da un compilatore intrinseco.
Jstd::byte è abilitato da /std:c++17 o versione successiva, ma poiché può essere in conflitto con le intestazioni di Windows SDK in alcuni casi, presenta una macro con granularità fine. Per disabilitarla, definire _HAS_STD_BYTE come 0.
Okay MSVC non supporta la parola chiave o i _Complex tipi complessi nativi. Universal CRT <complex.h> usa macro specifiche dell'implementazione per ottenere lo stesso effetto. Per altre informazioni, vedere Supporto matematico complesso C.
L Universal CRT non implementa i strftimeE modificatori di conversione alternativi e O . Questi modificatori vengono ignorati (ad esempio, %Oe si comportano come %e). I modificatori non sono supportati dalle API delle impostazioni locali sottostanti.
M Universal CRT non implementa C11aligned_alloc, ma fornisce _aligned_malloc e _aligned_free. Poiché il sistema operativo Windows non supporta le allocazioni allineate, è improbabile che questa funzione venga implementata.
N La dichiarazione viene rimossa, ma l'esportazione per la funzione rimane per compatibilità con le versioni precedenti.
O Alcune funzioni di controllo dei limiti non sono implementate o hanno firme diverse o non fanno parte dello standard C11 o C17. Queste funzioni non sono implementate: abort_handler_s, ignore_handler_s, memset_sset_constraint_handler_s, snprintf_s, snwprintf_s, strerrorlen_s. vsnwprintf_s Queste funzioni hanno firme diverse: gmtime_s, localtime_s, qsort_s, strtok_s, vsnprintf_s, wcstok_s. Queste funzioni non vengono visualizzate nello standard: clearerr_s, fread_s.
P Il supporto è stato aggiunto in Visual Studio 2019 versione 16.10. Il supporto per Clang è stato aggiunto in Visual Studio 2022 versione 17.0.
Q In questo modo vengono rimossi declare_reachable, undeclare_reachabledeclare_no_pointers, undeclare_no_pointers, , get_pointer_safety. In precedenza, queste funzioni non avevano alcun effetto.
R Si tratta di una modifica comune che causa un'interruzione di origine. Tuttavia, il codice che in precedenza aveva un comportamento non definito in fase di esecuzione viene ora rifiutato con errori del compilatore.
S Gli adattatori dell'intervallo di input e counted_iterator vengono implementati in VS 2022 17.0. È previsto un aggiornamento futuro di Visual Studio 2019 versione 16.11 per incorporare queste modifiche.
T<stdatomic.h> è attualmente supportato quando viene compilato come C++ (/std:c++latest). Non è ancora supportato quando viene compilato come C (/std:c11 e /std:c17)
14 Queste funzionalità C++17 e C++20 sono sempre abilitate, anche quando /std:c++14 viene specificato (impostazione predefinita). Il motivo è dovuto al fatto che la funzionalità è stata implementata prima dell'introduzione delle /std opzioni o perché l'implementazione condizionale era indesiabilmente complessa.
17 Queste funzionalità sono abilitate dall'opzione del /std:c++17 compilatore o versione successiva.
20 Nelle versioni tramite Visual Studio 2019 versione 16.10 queste funzionalità sono abilitate dall'opzione del /std:c++latest compilatore. Visual Studio 2019 versione 16.11 ha aggiunto l'opzione /std:c++20 del compilatore per abilitare queste funzionalità.
20abi A causa del lavoro di post-rilascio in corso sullo standard C++20, , <format>le parti di formattazione di (che si basano su <format>) e le factory di <chrono> gamma e gli adattatori di intervallo da <ranges> (tutto ciò che richiede il view concetto) sono disponibili solo in /std:c++latest. Aspettatevi che queste funzionalità siano /std:c++20 previste dopo il raggiungimento dell'accordo con WG21 che non sono necessarie ulteriori modifiche che causano interruzioni di ABI. Le parti rimanenti di <chrono> e gli algoritmi applicabili agli intervalli sono abilitati nell'opzione del /std:c++20 compilatore in Visual Studio 2019 versione 16.11 e versioni successive.
23 In Visual Studio 2022 versione 17.0 e successive queste funzionalità sono abilitate dall'opzione del /std:c++latest compilatore.
C11 Il supporto del compilatore per C11 e C17 richiede Visual Studio 2019 versione 16.8 o successiva. Ad eccezione di quanto indicato, il supporto della libreria C11 e C17 richiede Windows SDK build 10.0.20211.0 o versione successiva. Per altre informazioni su come installare il supporto per C11 e C17, vedere Installare il supporto C11 e C17 in Visual Studio.
DR Queste funzionalità sono abilitate in tutte le modalità di opzione del compilatore C++/std. Il comitato standard C++ ha adottato questa modifica come rapporto di difetto retroattivo a C++11 e a tutte le versioni successive.
2104 Il supporto della libreria C11 per questa funzionalità richiede Windows SDK build 10.0.20348.0 (versione 2104) o versione successiva.