Conformidade com a linguagem do Microsoft C/C++ pela versão do Visual Studio
Artigo
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.
VS 2019 16.5. Para aprimorar a compatibilidade com versões anteriores, __VA_OPT__ está habilitado em /Zc:preprocessor em todas as versões da linguagem.
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.
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
Recurso
Com suporte
Recursos da biblioteca padrão C99
Com suporte
Macros ortográficas alternativas <iso646.h>
VS 2015
Suporte a caracteres largos <wchar.h> e <wctype.h>
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.
Observações
A No modo /std:c++14, as especificações de exceção dinâmica permanecem não implementadas e throw() ainda é tratado como sinônimo de __declspec(nothrow). No C++17, as especificações de exceções dinâmicas foram, em grande parte, removidas por P0003R5, exceto por um vestígio: throw() foi preterido e obrigado a se comportar como um sinônimo de 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-.
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.
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 foram 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.
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:
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). Os modificadores não têm suporte nas APIs de localidade subjacentes.
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.
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)
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.
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.