Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A conformidade com os padrões do compilador do Microsoft C/C++ no Visual Studio (MSVC) é um trabalho em andamento. A seguir um resumo da conformidade de linguagem e biblioteca do ISO Standard C e C++ pela versão do Visual Studio. Cada nome de recurso da Biblioteca Padrão e do compilador C++ tem um link para o documento de proposta ISO C++ Standard que descreve o recurso, quando ele estiver disponível no momento da publicação. A coluna Com suporte lista a versão do Visual Studio no qual o suporte para o recurso apareceu pela primeira vez.
Para obter detalhes sobre melhorias de conformidade, consulte Melhorias de conformidade do C++ no Visual Studio. Para obter uma lista de outras alterações, confira As novidades do Microsoft C++ no Visual Studio. Para alterações de compatibilidade em versões anteriores, consulte Histórico de alterações do Visual C++ e Novidades do Visual C++ de 2003 a 2015. Para saber mais sobre as últimas notícias da equipe do C++, visite o blog da equipe do C++.
Note
Não há alterações significativas binárias entre o Visual Studio 2015, 2017, 2019 e 2022. Para obter mais informações, confira Compatibilidade binária do C++ entre as versões do Visual Studio.
Recursos do compilador C++
Recursos da biblioteca padrão C++
Uma listagem mais detalhada de recursos da Biblioteca Padrão e correções de bugs por versão do produto está disponível na página changelog wiki do GitHub Microsoft STL.
Para obter as informações mais recentes sobre o trabalho de conformidade contínua, consulte:
Um grupo de documentos listados em conjunto indica um recurso Standard junto com uma ou mais melhorias ou expansões aprovadas. Esses recursos são implementados juntos.
Recursos da biblioteca padrão C
| Feature | Supported |
|---|---|
| Recursos da biblioteca padrão C99 | Supported |
Macros ortográficas alternativas <iso646.h> |
VS 2015 |
Suporte a caracteres largos <wchar.h> e <wctype.h> |
VS 2015 |
Suporte complexo em <complex.h> |
Parcial no VS 2015 K |
Funções matemáticas de tipo genérico <tgmath.h> |
VS 2019 16.8 2104 |
Características de ponto flutuante adicionais <float.h> |
VS 2015 |
Especificadores de printf flutuante hexadecimal %A, %a |
VS 2015 |
Tipos de inteiros estendidos <inttypes.h>, <stdint.h> |
Visual Studio 2015 |
vscanf família em <stdio.h> e <wchar.h> |
VS 2015 |
Novas funções matemáticas em <math.h> |
VS 2015 |
Tratamento de condições de erro da biblioteca matemática (math_errhandling) |
VS 2015 |
Acesso ao ambiente de ponto flutuante <fenv.h> |
VS 2015 |
Especificador de conversão %lf para printf |
VS 2015 |
Família de funções snprintf em <stdio.h> |
VS 2015 |
Tipo boolean em <stdbool.h> |
VS 2015 |
Macro va_copy |
Visual Studio 2015 |
Especificadores de conversão strftime adicionais |
Parcial no VS 2015 L |
| Recursos da biblioteca padrão C11 | Supported |
Especificadores de alinhamento <stdalign.h> |
VS 2019 16.8 C11, 2104 |
aligned_alloc |
Não M |
Sem especificadores de retorno <stdnoreturn.h> |
VS 2019 16.8 C11, 2104 |
Suporte a threading <threads.h> |
yes |
Suporte atômico <stdatomic.h> |
experimental |
char16_t, char32_t<uchar.h> |
VS 2019 16.8 C11 |
gets() removido |
VS 2019 16.8 C11, N |
gets_s() |
VS 2019 16.8 C11 |
Interfaces de verificação de limites (APIs *_s) |
Parcial no VS 2015 C11, O |
fopen
"x" opção |
VS 2019 16.8 C11 |
| Asserções estáticas | VS 2019 16.8 C11, 2104 |
quick_exit |
VS 2019 16.8 C11 |
Macros <complex.h> |
VS 2019 16.8 C11 |
características de ponto flutuante <float.h> |
VS 2019 16.8 C11 |
Threads <threads.h> do C11 |
VS 2022 17.8 C11 |
Valores com suporte
No ainda não está implementado.
Parcial significa que a implementação está incompleta. Para obter mais informações, veja a seção Observações.
VS 2010 com suporte no Visual Studio 2010.
VS 2013 com suporte no Visual Studio 2013.
VS 2015 com suporte no Visual Studio 2015 (RTW).
VS 2015.2 e VS 2015.3 indicam os recursos com suporte no Visual Studio 2015 Atualização 2 e no Visual Studio 2015 Atualização 3, respectivamente.
VS 2017 15.0 com suporte no Visual Studio 2017 versão 15.0 (RTW).
VS 2017 15.3 com suporte no Visual Studio 2017 versão 15.3.
VS 2017 15.5 com suporte no Visual Studio 2017 versão 15.5.
VS 2017 15.7 com suporte no Visual Studio 2017 versão 15.7.
VS 2019 16.0 com suporte no Visual Studio 2019 versão 16.0 (RTW).
VS 2019 16.1 com suporte no Visual Studio 2019 versão 16.1.
VS 2019 16.2 com suporte no Visual Studio 2019 versão 16.2.
VS 2019 16.3 com suporte no Visual Studio 2019 versão 16.3.
VS 2019 16.4 com suporte no Visual Studio 2019 versão 16.4.
VS 2019 16.5 com suporte no Visual Studio 2019 versão 16.5.
VS 2019 16.6 com suporte no Visual Studio 2019 versão 16.6.
VS 2019 16.7 com suporte no Visual Studio 2019 versão 16.7.
VS 2019 16.8 com suporte no Visual Studio 2019 versão 16.8.
VS 2019 16.9 com suporte no Visual Studio 2019 versão 16.9.
VS 2019 16.10 com suporte no Visual Studio 2019 versão 16.10.
VS 2022 17.0 com suporte no Visual Studio 2022 versão 17.0.
VS 2022 17.1 com suporte no Visual Studio 2022 versão 17.1.
VS 2022 17.2 com suporte no Visual Studio 2022 versão 17.2.
VS 2022 17.3 com suporte no Visual Studio 2022 versão 17.3.
VS 2022 17.4 com suporte no Visual Studio 2022 versão 17.4.
VS 2022 17.5 com suporte no Visual Studio 2022 versão 17.5.
Ferramentas de Build do MSVC versão 14.50 Com suporte no Visual Studio 2026 18.0 (compilador MSVC versão 19.50) e superior.
Notes
A No modo /std:c++14, o compilador deixa as especificações de exceção dinâmica não implementadas e trata throw() como sinônimo para __declspec(nothrow). No C++17, P0003R5 removeu a maioria das especificações de exceção dinâmica, exceto por um vestígio: o padrão descontinuado throw() e exige que ele se comporte como sinônimo para noexcept. No modo /std:c++17, agora o MSVC está em conformidade com o padrão, fornecendo a throw() o mesmo comportamento de noexcept, que é a imposição por meio de encerramento.
A opção do compilador /Zc:noexceptTypes solicita o comportamento antigo de __declspec(nothrow). É provável que throw() seja removido em uma versão futura do C++. Para ajudar com a migração do código em resposta a essas alterações no padrão e na implementação da Microsoft, novos avisos do compilador para problemas de especificação de exceção foram adicionados em /std:c++17 e /permissive-.
B Com suporte no modo /permissive- no Visual Studio 2017 versão 15.7. Para obter mais informações, consulte Two-phase name lookup support comes to MSVC.
C No Visual Studio 2019 versão 16.6 e versões posteriores, o compilador implementa totalmente o pré-processador C99 padrão por meio da opção /Zc:preprocessor. (No Visual Studio 2017 versões 15.8 a 16.5, o compilador dá suporte ao pré-processador C99 padrão por meio da opção do compilador /experimental:preprocessor). Essa opção está ativada por padrão quando a opção do compilador /std:c11 ou /std:c17 for especificada.
D Com suporte em /std:c++14 com um aviso suprimível, C4984.
E A implementação é suficiente para dar suporte a Biblioteca Padrão C++20. Uma implementação completa requer uma alteração interruptiva binária.
F Recursos removidos quando a opção do compilador /std:c++17 ou posterior é especificada. Esses recursos podem ser habilitados novamente de modo a facilitar a transição para os modos de idioma mais recentes pelo uso destas macros: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS e _HAS_UNEXPECTED.
G A biblioteca de algoritmos paralelos do C++17 está concluída. Concluir não significa que cada algoritmo seja paralelizado em todos os casos. Os algoritmos mais importantes são paralelizados. Assinaturas de política de execução são fornecidas mesmo quando a implementação não paraleliza algoritmos. O cabeçalho interno central, <yvals_core.h>, contém as seguintes "Observações de algoritmos paralelos": O C++ permite a implementação de algoritmos paralelos como chamadas para os algoritmos seriais. Essa implementação paraleliza várias chamadas de algoritmo comum, mas não todas.
Os seguintes algoritmos são paralelizados:
-
adjacent_difference,adjacent_find,all_of,any_of,countcount_ifequalexclusive_scanfindfind_endfind_first_offind_iffind_if_notfor_eachfor_each_ninclusive_scanis_heapis_heap_untilis_partitionedis_sortedis_sorted_untilmismatchnone_ofpartitionreduceremoveremove_ifreplacereplace_ifsearchsearch_nset_differenceset_intersectionsortstable_sorttransformtransform_exclusive_scantransform_inclusive_scantransform_reduce
Esses algoritmos não estão atualmente paralelizados:
- Esses algoritmos não mostram nenhum aprimoramento do desempenho perceptível de paralelismo no hardware de destino. Todos os algoritmos que meramente copiam ou permutam elementos sem ramificações são tipicamente limitados por largura de banda de memória:
-
copy,copy_n,fill,fill_n,movereversereverse_copyrotaterotate_copyshift_leftshift_right,swap_ranges
-
- Existe confusão sobre os requisitos de paralelismo do usuário para esses algoritmos, que provavelmente estão na categoria acima:
-
generate,generate_n
-
- O paralelismo eficaz desses algoritmos pode ser inviável:
-
partial_sort,partial_sort_copy
-
- Esses algoritmos ainda não foram avaliados. A biblioteca pode implementar o paralelismo em uma versão futura:
-
copy_if,includes,inplace_merge,lexicographical_compare,max_elementmergemin_elementminmax_elementnth_elementpartition_copyremove_copyremove_copy_ifreplace_copyreplace_copy_ifset_symmetric_differenceset_unionstable_partitionuniqueunique_copy
-
H Esta é uma implementação completamente nova, incompatível com a versão anterior std::experimental, tornada necessária pelo suporte a links simbólicos, correções de bugs e mudanças no comportamento requerido pelos padrões. Atualmente, <filesystem> fornece o std::filesystem novo e o anterior std::experimental::filesystem. O cabeçalho <experimental/filesystem> fornece apenas a implementação experimental antiga. Espere a remoção da implementação experimental na próxima versão de quebra de ABI das bibliotecas.
I Com suporte por um compilador intrínseco.
Jstd::byte está habilitado por /std:c++17 ou posterior, mas, como pode entrar em conflito com os cabeçalhos do SDK do Windows em alguns casos, possui uma macro de recusa refinada. Para desabilitá-lo, defina _HAS_STD_BYTE como 0.
K O MSVC não dá suporte à palavra-chave _Complex ou a tipos complexos nativos. O CRT Universal <complex.h> usa macros específicas da implementação para obter o mesmo efeito. Para obter mais informações, consulte Suporte matemático complexo em C.
L O Universal CRT não implementa os modificadores de conversão alternativos strftimeE e O. Esses modificadores são ignorados (por exemplo, %Oe se comporta da mesma forma que %e). As APIs de localidade subjacente não dão suporte aos modificadores.
M O CRT Universal não implementa o C11 aligned_alloc, mas fornece _aligned_malloc e _aligned_free. Como o sistema operacional Windows não dá suporte a alocações alinhadas, é improvável que essa função seja implementada.
N A declaração foi removida, mas a exportação da função permanece para compatibilidade com versões anteriores.
O Certas funções de verificação de limites não estão implementadas, têm assinaturas diferentes ou não fazem parte dos padrões C11 ou C17. Essas funções não estão implementadas: abort_handler_s, ignore_handler_s, memset_s, set_constraint_handler_s, snprintf_s, snwprintf_s, strerrorlen_s, vsnwprintf_s. Essas funções têm assinaturas diferentes: gmtime_s, localtime_s, qsort_s, strtok_s, vsnprintf_s, wcstok_s. Essas funções não aparecem no Standard: clearerr_s, fread_s.
P O suporte foi adicionado no Visual Studio 2019 versão 16.10. O suporte ao Clang foi adicionado ao Visual Studio 2022 versão 17.0.
Q Remove declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers, get_pointer_safety. Anteriormente, essas funções não tinham efeito.
R Esta é uma alteração comum de quebra de fonte. No entanto, o código que anteriormente tinha um comportamento indefinido no runtime agora é rejeitado com erros do compilador.
S Os adaptadores de intervalo de entrada e counted_iterator são implementados no VS 2022 17.0. Uma atualização futura do Visual Studio 2019 versão 16.11 está planejada para incorporar essas alterações.
T<stdatomic.h> atualmente tem suporte quando compilado como C++ (/std:c++latest). Ele ainda não tem suporte quando compilado como C (/std:c11 e /std:c17)
Os tipos de ponto flutuante estendido U são um recurso opcional do C++23. Esse recurso não será implementado até que a padronização do C++23 seja finalizada.
V Use as opções /source-charset:utf-8 do compilador e /we4828 trate os arquivos de origem como codificados em UTF-8.
14 Esses recursos do C++17 e do C++20 estão sempre habilitados, mesmo quando /std:c++14 (o padrão) estiver especificado. O motivo é porque o recurso foi implementado antes da introdução das opções /std ou, porque a implementação condicional era complexa de uma maneira indesejável.
17 Esses recursos estão habilitados pela opção do compilador /std:c++17 ou posterior.
20 Nas versões até o Visual Studio 2019 versão 16.10, esses recursos estão habilitados pela opção do compilador /std:c++latest. O Visual Studio 2019 versão 16.11 adicionou a opção do compilador /std:c++20 para habilitar esses recursos.
20abi Devido ao trabalho de pós-lançamento em andamento no padrão C++20, <format>, as partes de formatação de <chrono> (que dependem de <format>) e as fábricas de intervalo e adaptadores de intervalo de <ranges> (tudo o que precisa do conceito view) só estão disponíveis em /std:c++latest. Espere esses recursos em /std:c++20 após o acordo ser alcançado com o WG21, de que não será necessária nenhuma alteração interruptiva de ABI adicional. As partes restantes de <chrono> e os algoritmos que se aplicam a intervalos estão habilitados na opção /std:c++20 do compilador no Visual Studio 2019 versão 16.11 e versões posteriores.
23 No Visual Studio 2022 versão 17.0 e posteriores, esses recursos estão habilitados pela opção de compilador /std:c++latest.
24 No MSVC Build Tools versão 14.50 ou superior (fornecido pela primeira vez com o Visual Studio 2026 versão 18.0), esses recursos são habilitados pela opção do /std:c++latest compilador.
C11 O suporte ao compilador para C11 e C17 requer o Visual Studio 2019 versão 16.8 ou superior. Exceto como observado, o suporte à biblioteca C11 e C17 requer o build 10.0.20211.0 do SDK do Windows ou posterior. Para obter mais informações sobre como instalar o suporte para C11 e C17, consulte Suporte à instalação de C11 e C17 no Visual Studio.
DR Esses recursos estão habilitado em todos os modos de opção do compilador C++ /std. O comitê padrão do C++ adotou essa alteração como um relatório de defeito retroativo para C++11 e todas as versões posteriores.
2104 O suporte à biblioteca C11 para este recurso requer o Windows SDK build 10.0.20348.0 (versão 2104) ou superior.
Consulte também
Referência da linguagem C++
Biblioteca Padrão do C++
Aprimoramentos de conformidade do C++ no Visual Studio
Novidades do Microsoft C++ no Visual Studio
Histórico de alterações de 2003 a 2015 do Visual C++
O que há de novo no Visual C++ de 2003 até 2015
Blog da equipe do C++