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.
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, especificações de exceções dinâmicas permanecem não implementadas, e throw() ainda é tratado como um sinônimo para __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 à Biblioteca Padrão do C++20. Uma implementação completa requer uma alteração interruptiva binária.
F Recursos removidos quando a opção /std:c++17 do compilador 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 Biblioteca de algoritmos paralelos do C++17 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 simplesmente copiam ou permutam elementos sem ramificações são normalmente limitados à largura de banda da memória:
H Essa é uma implementação completamente nova, incompatível com a versão std::experimental anterior, que se tornou necessária pelo suporte a symlink, correções de bugs e alterações no comportamento exigido pelo padrão. 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.
ICom suporte de um compilador intrínseco.
Jstd::byte é habilitado por /std:c++17 ou posterior, mas, como ele pode entrar em conflito com os cabeçalhos do SDK do Windows em alguns casos, ele tem 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 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 CRT Universal não implementa o strftimeE e os modificadores de conversão alternativos 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 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 é removida, mas a exportação para a função permanece para compatibilidade com versões anteriores.
O Certas funções de verificação de limites não são simplificadas ou têm assinaturas diferentes ou não fazem parte do padrão 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 Isso remove declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers, get_pointer_safety. Anteriormente, essas funções não tinham efeito.
R Essa é uma alteração comum de interrupção de fonte. No entanto, o código que anteriormente tinha um comportamento indefinido no runtime agora é rejeitado com erros do compilador.
S Adaptadores do intervalo de entrada e counted_iterator foram 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 Atualmente, há suporte para <stdatomic.h> 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 C++20 estarã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 são habilitados pela opção /std:c++17 do compilador ou posterior.
20 Em versões por meio do Visual Studio 2019 versão 16.10, esses recursos sã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 pós-lançamento contínuo 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 superiores, esses recursos são habilitados pela opção do 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 habilitados 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 esse recurso requer o build 10.0.20348.0 do SDK do Windows (versão 2104) ou superior.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja: https://aka.ms/ContentUserFeedback.