Conformità del linguaggio Microsoft C/C++ dalla versione di Visual Studio
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à.
Per informazioni dettagliate sui miglioramenti della conformità, vedere Miglioramenti della conformità C++ in Visual Studio. Per un elenco di altre modifiche, vedere Novità di Visual C++ in Visual Studio. Per le modifiche della conformità nelle versioni precedenti, vedere Cronologia delle modifiche di Visual C++ e Visual C++: novità dalla versione 2003 alla 2015. Per notizie aggiornate dal team di C++, visitare il blog del team di C++.
Nota
Non sono presenti modifiche di rilievo binarie tra Visual Studio 2015, 2017, 2019 e 2022. Per altre informazioni, vedere Compatibilità binaria C++ tra le versioni di Visual Studio
Funzionalità del compilatore C++
Funzionalità della libreria standard C++
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.
Funzionalità della libreria C Standard
Funzionalità | Supportata |
---|---|
Funzionalità della libreria Standard C99 | Supportata |
Macro di ortografia alternative <iso646.h> |
VS 2015 |
Supporto <wchar.h> di caratteri wide e <wctype.h> |
VS 2015 |
Supporto complesso in <complex.h> |
Parziale in VS 2015 K |
Digitare funzioni matematiche generiche <tgmath.h> |
VS 2019 16.8 2104 |
Caratteristiche aggiuntive a virgola mobile <float.h> |
VS 2015 |
Identificatori di printf %A float esadecimali , %a |
VS 2015 |
Tipi integer <inttypes.h> estesi , <stdint.h> |
VS 2015 |
vscanf famiglia in <stdio.h> e <wchar.h> |
VS 2015 |
Nuove funzioni matematiche in <math.h> |
VS 2015 |
Trattamento delle condizioni di errore della libreria matematica (math_errhandling ) |
VS 2015 |
Accesso all'ambiente a virgola mobile <fenv.h> |
VS 2015 |
%lf identificatore di conversione per printf |
VS 2015 |
snprintf famiglia di funzioni in <stdio.h> |
VS 2015 |
boolean digitare in <stdbool.h> |
VS 2015 |
va_copy Macro |
VS 2015 |
Identificatori di conversione aggiuntivi strftime |
Parziale in VS 2015 L |
Funzionalità della libreria Standard C11 | Supportata |
Identificatori di allineamento <stdalign.h> |
VS 2019 16.8 C11, 2104 |
aligned_alloc |
No M |
Nessun identificatore restituito <stdnoreturn.h> |
VS 2019 16.8 C11, 2104 |
Supporto del threading <threads.h> |
No |
Supporto atomico <stdatomic.h> |
No |
char16_t , char32_t <uchar.h> |
VS 2019 16.8 C11 |
gets() Rimosso |
VS 2019 16.8 C11, N |
gets_s() |
VS 2019 16.8 C11 |
Interfacce di controllo dei limiti (*_s API) |
Parziale in VS 2015 C11, O |
fopen "x" Opzione |
VS 2019 16.8 C11 |
Asserzioni statiche | VS 2019 16.8 C11, 2104 |
quick_exit |
VS 2019 16.8 C11 |
Macro <complex.h> |
VS 2019 16.8 C11 |
caratteristiche a virgola mobile <float.h> |
VS 2019 16.8 C11 |
Valori supportati
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
In modalità le specifiche delle eccezioni dinamiche rimangono non implementate e throw()
vengono comunque considerate come sinonimi di __declspec(nothrow)
./std:c++14
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 facilitare la migrazione del codice in risposta a queste modifiche nell'implementazione Standard e Microsoft, sono stati aggiunti nuovi avvisi del compilatore per i problemi di specifica delle eccezioni in /std:c++17
e /permissive-
.
B Supportato in /permissive-
modalità in Visual Studio 2017 versione 15.7. Per ulteriori informazioni, vedere Two-phase name lookup support comes to MSVC
.
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 Features removed when the /std:c++17
or later compiler option is specified. 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_MEMBERS
e _HAS_UNEXPECTED
.
La libreria di algoritmi paralleli di G 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.
Vengono parallelizzati gli algoritmi seguenti:
adjacent_difference
, , , ,partition
find_end
find
find_first_of
find_if
find_if_not
for_each
none_of
mismatch
reduce
is_sorted_until
is_sorted
is_partitioned
remove
is_heap_until
is_heap
inclusive_scan
remove_if
for_each_n
exclusive_scan
equal
count_if
transform_exclusive_scan
search_n
set_difference
set_intersection
search
stable_sort
transform_inclusive_scan
sort
replace
replace_if
transform
count
any_of
adjacent_find
all_of
transform_reduce
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:
copy
,copy_n
, ,fill_n
move
,reverse
,reverse_copy
rotate_copy
rotate
, ,shift_right
shift_left
fill
swap_ranges
- Per questi algoritmi esiste una confusione rispetto ai requisiti di parallelismo utente, che probabilmente si trovano nella categoria precedente:
generate
,generate_n
- Un parallelismo efficace di questi algoritmi potrebbe essere infeasible:
partial_sort
,partial_sort_copy
- Questi algoritmi non sono ancora stati valutati. La libreria potrebbe implementare il parallelismo in una versione futura:
copy_if
,includes
,lexicographical_compare
, ,stable_partition
remove_copy_if
remove_copy
replace_copy
partition_copy
replace_copy_if
nth_element
unique
merge
set_union
min_element
set_symmetric_difference
minmax_element
max_element
inplace_merge
unique_copy
H Si tratta di un'implementazione completamente nuova, incompatibile con la versione precedente std::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.
I 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
.
K 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 strftime
E
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 C11 aligned_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 garantire la 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_s
set_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
.
Il supporto P è stato aggiunto in Visual Studio 2019 versione 16.10. Il supporto per Clang è stato aggiunto in Visual Studio 2022 versione 17.0.
D Questa operazione rimuove declare_reachable
, undeclare_reachable
, declare_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.
Gli adattatori dell'intervallo di input S 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
(impostazione predefinita) è specificato. 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 con 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 post-rilascio in corso sullo standard C++20, <format>
, le parti di formattazione di <chrono>
(che si basano su <format>
) e le factory di gamma e gli adattatori di gamma da <ranges>
(tutto ciò che ha bisogno del 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.
Il supporto del compilatore C11 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.
Ripristino di emergenza 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.
Il supporto della libreria C11 2104 per questa funzionalità richiede Windows SDK build 10.0.20348.0 (versione 2104) o versione successiva.
Vedi anche
Riferimenti al linguaggio C++
Libreria standard C++
Miglioramenti della conformità di C++ in Visual Studio
Novità di Visual C++ in Visual Studio
Cronologia delle modifiche di Visual C++ dal 2003 al 2015
Visual C++: novità dalla versione 2003 alla 2015
Blog del team di C++
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per