Novidades do C++ no Visual Studio 2017

O Visual Studio 2017 traz muitas atualizações e correções para o ambiente do C++. Corrigimos mais de 250 bugs e problemas relatados no compilador e nas ferramentas. Muitos deles foram enviados pelos clientes pelas opções Relatar um Problema e Fornecer uma Sugestão em Enviar Comentários. Obrigado por relatar bugs!

Para saber mais sobre todas as novidades do Visual Studio, visite Novidades no Visual Studio 2017. Para saber mais sobre novidades de C++ no Visual Studio 2019, confira Novidades de C++ no Visual Studio 2019. Para saber mais sobre as novidades de C++ no Visual Studio 2015 e em versões anteriores, confira O que há de novo no Visual C++ de 2003 a 2015. Para obter informações sobre as novidades nos documentos do C++, consulte Microsoft docs C++: novidades.

Compilador C++ do Visual Studio 2017

Aprimoramentos de conformidade do C++

Atualizamos o compilador do C++ e a biblioteca padrão nessa versão com suporte melhorado para as funcionalidades C++11 e C++14. Isso inclui também suporte preliminar para determinadas funcionalidades esperadas no padrão C++17. Para obter informações detalhadas, consulte Aprimoramentos de conformidade do C++ no Visual Studio 2017.

Visual Studio 2017 versão 15.5

O compilador é compatível com cerca de 75% das funcionalidades novas do C++17, incluindo associações estruturadas, lambdas constexpr, if constexpr, variáveis embutidas, expressões de dobra e adição de noexcept ao tipo sistema. Estas funcionalidades estão disponíveis na opção /std:c++17. Para obter mais informações, veja Melhorias de conformidade do C++ no Visual Studio 2017

Visual Studio 2017 versão 15.7

Agora, o conjunto de ferramentas do compilador do MSVC no Visual Studio versão 15.7 é compatível com o padrão do C++. Para obter mais informações, consulte Apresentação: MSVC está em conformidade com o padrão C++ e Conformidade de linguagem do Microsoft C/C++.

Visual Studio 2017 versão 15.8

A opção /experimental:preprocessor do compilador habilita o novo pré-processador MSVC experimental que certamente estará em conformidade com todos os padrões C e C++ aplicáveis. Para obter mais informações, consulte a Visão geral do novo pré-processador do MSVC.

Novas opções do compilador

  • /permissive-: Habilite todas as opções do compilador de conformidade estrita com os padrões e desabilite a maioria das extensões do compilador específicas da Microsoft (mas não __declspec(dllimport), por exemplo). Essa opção está ativada por padrão no Visual Studio 2017 versão 15.5. O modo de conformidade /permissive- inclui compatibilidade com a pesquisa de nome em duas fases. Para obter mais informações, veja Melhorias de conformidade do C++ no Visual Studio.

  • /diagnostics: habilita a exibição do erro de diagnóstico ou do local de aviso de três maneiras diferentes: apenas o número da linha, o número da linha e a coluna, ou o número da linha e da coluna, com um ponto de atenção sob a linha de código com erro.

  • /debug:fastlink: habilite tempos de link incrementais até 30% mais rápidos (vs. Visual Studio 2015) não copiando todas as informações de depuração para o arquivo PDB. Em vez disso, o arquivo PDB aponta para as informações de depuração para os arquivos de biblioteca e de objeto usados para criar o executável. Consulte (Ciclo de build do C++ mais rápido no VS "15" com /Debug:fastlink e Recomendações para acelerar builds do C++ no Visual Studio).

  • O Visual Studio 2017 permite o uso de /sdl com /await. Removemos a limitação /RTC com corrotinas.

Visual Studio 2017 versão 15.3
  • /std:c++14 e /std:c++latest: Com essas opções do compilador, é possível aceitar versões específicas de linguagem de programação ISO C++ em um projeto. A maioria das novas funcionalidades padrão de rascunho é protegida pela opção /std:c++latest.

  • /std:c++17 habilita o conjunto de funcionalidades do C++17 implementado pelo compilador. Essa opção desabilita o suporte ao compilador e à biblioteca padrão para funcionalidades após o C++17: as que foram alteradas ou as novas nas versões posteriores das atualizações de defeito e de rascunho de trabalho do C++ Standard. Para habilitar essas funcionalidades, use /std:c++latest.

Geração de código, segurança, diagnóstico e controle de versão

Esta versão apresenta várias melhorias na otimização, na geração de código, no controle de versão do conjunto de ferramentas e nos diagnósticos. Alguns aprimoramentos importantes incluem:

  • Melhor geração de código de loops: suporte para vetorização automática da divisão de inteiros constantes, melhor identificação de padrões de memset.
  • Melhor segurança do código: melhoria na emissão de diagnóstico do compilador de estouro de buffer e /guard:cf agora protege instruções de opções que geram uma tabelas de saltos.
  • Controle de versão: o valor da macro do pré-processador interna _MSC_VER está sendo monotonicamente atualizado a cada atualização do conjunto de ferramentas do Visual C++. Para obter mais informações, consulte Versão do compilador do Visual C++.
  • Novo layout do conjunto de ferramentas: o compilador e as ferramentas de build relacionadas têm um novo local e nova estrutura de diretório em seu computador de desenvolvimento. O novo layout habilita instalações lado a lado de várias versões do compilador. Para saber mais, confira Layout de ferramentas do compilador no Visual Studio 2017.
  • Diagnósticos aprimorados: a janela de saída agora mostra a coluna em que ocorre um erro. Para obter mais informações, consulte Aprimoramentos de diagnóstico do compilador do C++ no VS "15" Preview 5.
  • Ao usar corrotinas, a palavra-chave experimental suspender (disponível na opção /await) foi removida. Em vez disso, seu código deve ser atualizado para usar co_yield. Para saber mais, confira a palavra-chave yield para se tornar co_yield no VS 2017.
Visual Studio 2017 versão 15.3

Aprimoramentos nos diagnósticos do compilador. Para saber mais, confira Aperfeiçoamentos de diagnóstico no Visual Studio 2017 15.3.0.

Visual Studio 2017 versão 15.5

O desempenho do runtime do Visual C++ continua a melhorar por meio da melhor qualidade do código gerado. Agora você pode simplesmente recompilar o código e o aplicativo será executado mais rapidamente. Algumas das otimizações do compilador são totalmente novas, como a vetorização de repositórios escalares condicionais, a combinação de chamadas sin(x) e cos(x) em um novo sincos(x) e a eliminação de instruções redundantes do otimizador de SSA. Outras otimizações do compilador são melhorias de funcionalidades existentes, tais como: heurística do vetorizador para expressões condicionais, melhores otimizações de loop e codegen mín/máx de float. O vinculador tem uma implementação de /OPT:ICF nova e mais rápida que pode resultar em aceleração de até 9% do tempo de vinculação, além de outras correções de desempenho na vinculação incremental. Para obter mais informações, consulte /OPT (Otimizações) e /INCREMENTAL (Vincular de maneira incremental).

O compilador do Microsoft C++ dá suporte ao AVX-512 da Intel. Ele tem instruções de Tamanho do Vetor que trazem novas funções no AVX-512 para registradores de 128 e 256 bits.

A opção /Zc:noexceptTypes- pode ser usada para reverter para a versão C++14 do noexcept ao usar o modo C++17 em geral. Essa opção permite que você atualize seu código-fonte para estar em conformidade com a C++17 sem precisar reescrever todo o código throw() ao mesmo tempo. Para obter mais informações, consulte Remoção de especificação de exceção dinâmica e noexcept.

Visual Studio 2017 versão 15.7

Biblioteca padrão C++

Melhorias de correção

Visual Studio 2017 RTM (versão 15.0)
  • Pequenas melhorias de diagnóstico basic_string_ITERATOR_DEBUG_LEVEL != 0. Quando uma verificação IDL é acionada em um mecanismo de cadeia de caracteres, ela agora informa o comportamento específico que causou o acionamento. Por exemplo, em vez de "iterador de cadeia de caracteres não desreferenciável", você obtém "não é possível desreferenciar o iterador de cadeia de caracteres porque ele está fora do intervalo (por exemplo, um iterador final)".
  • O operador de atribuição de mudança std::promise foi corrigido, pois anteriormente poderia causar bloqueio indefinido no código.
  • Erros de compilador corrigidos, com a conversão implícita de atomic<T*> em T*.
  • pointer_traits<Ptr> agora detecta Ptr::rebind<U> corretamente.
  • Corrigido o qualificador const ausente no operador de subtração move_iterator.
  • Corrigido o gerador de código inválido silencioso para alocadores definidos pelo usuário com estado solicitando propagate_on_container_copy_assignment e propagate_on_container_move_assignment.
  • atomic<T> agora tolera o operator&() sobrecarregado.
  • Pequena melhoria no diagnóstico do compilador para chamadas bind() incorretas.

Há mais melhorias de biblioteca padrão no Visual Studio 2017 RTM. Para a lista completa, consulte a entrada do blog da equipe C++ Correções da biblioteca padrão no VS 2017 RTM.

Visual Studio 2017 versão 15.3
  • Os contêineres da biblioteca padrão agora fixam o max_size() ao numeric_limits<difference_type>::max() em vez do max() de size_type. Essa alteração garante que o resultado de distance() nos iteradores do contêiner seja representável no tipo de retorno de distance().
  • Especialização auto_ptr<void> ausente corrigida.
  • Os algoritmos for_each_n(), generate_n() e search_n() falharam anteriormente ao compilar se o argumento de comprimento não fosse um tipo integral. Agora, eles tentam converter os comprimentos não integrais em difference_type dos iteradores.
  • normal_distribution<float> não emite mais avisos na biblioteca padrão sobre o estreitamento de double para float.
  • Corrigidas algumas operações basic_string que usavam npos em vez de max_size() durante a verificação de estouro de tamanho máximo.
  • condition_variable::wait_for(lock, relative_time, predicate) esperava todo o tempo relativo se houvesse uma ativação falsa. Agora ele aguarda apenas um único intervalo do tempo relativo.
  • future::get() agora invalida o future, como o padrão exige.
  • iterator_traits<void *> era um erro de hardware porque tentava formar void&; agora claramente torna-se um struct vazio para permitir o uso de iterator_traits em condições SFINAE "is iterator".
  • Alguns avisos relatados pelo Clang -Wsystem-headers foram corrigidos.
  • Também foi corrigida a "especificação de exceção na declaração não corresponde à declaração anterior" relatada pelo Clang -Wmicrosoft-exception-spec.
  • Também corrigidos os avisos de ordenação mem-initializer-list relatados por Clang e C1XX.
  • Os contêineres não ordenados não trocavam funções de hash ou predicados quando os próprios contêineres eram trocados. Agora eles fazem isso.
  • Muitas operações de troca de contêiner agora são marcadas com noexcept (como a biblioteca padrão nunca pretende lançar uma exceção ao detectar a condição de um comportamento indefinido non-equal-allocator de non-propagate_on_container_swap).
  • Muitas operações vector<bool> agora são marcadas com noexcept.
  • A biblioteca padrão agora impõe o alocador correspondente value_type (no modo C++17) com uma recusa de saída de escape.
  • Corrigidas algumas condições em que self-range-insert em basic_string misturaria o conteúdo das cadeias de caracteres. (Observação: self-range-insert em vectors ainda é proibido pelo Standard.)
  • basic_string::shrink_to_fit() não é mais afetado pelo propagate_on_container_swap do alocador.
  • std::decay agora manipula tipos de função abomináveis, ou seja, tipos de função qualificados para cv-, ref ou ambos.
  • Alteradas as diretivas de inclusão para usar diferenciação adequada de maiúsculas e minúsculas e barras invertidas, melhorando a portabilidade.
  • Corrigido o aviso C4061 "O enumerador 'enumerador' na troca de enumeração 'enumeração' não é explicitamente tratado por um rótulo de caso." Esse aviso é desativado por padrão e foi corrigido como uma exceção à política geral da biblioteca padrão para avisos. (A biblioteca padrão está limpa de /W4, mas não tenta ser limpa de /Wall. Muitos avisos fora do padrão são extraordinariamente barulhentos e não devem ser usados regularmente.)
  • Melhoria nas verificações de depuração de std::list. Os iteradores de lista agora verificam operator->() e list::unique() agora marca os iteradores como invalidados.
  • Corrigida a metaprogramação de uses-allocator em tuple.
Visual Studio 2017 versão 15.5
  • std::partition agora chama o predicado N vezes, ao invés de N + 1 vezes, como o padrão exige.
  • As tentativas de evitar a estática mágica na versão 15.3 foram corrigidas na versão 15.5.
  • std::atomic<T> não requer mais que T seja construível por padrão.
  • Algoritmos de heap que levam tempo logarítmico se comportam de forma diferente quando a depuração do iterador está habilitada. Eles não fazem mais uma afirmação de tempo linear de que a entrada é de fato um heap.
  • __declspec(allocator) agora é protegido apenas para C1XX a fim de evitar avisos do Clang que não entendem esse declspec.
  • basic_string::npos agora está disponível como uma constante de tempo de compilação.
  • std::allocator no modo C++17 agora manipula corretamente a alocação de tipos excessivamente alinhados, isto é, tipos cujo alinhamento é superior a max_align_t, a menos que seja desabilitado por /Zc:alignedNew-. Por exemplo, vetores de objetos com alinhamento de 16 ou de 32 bytes agora serão corretamente alinhados para instruções SSE e AVX.

Aprimoramentos de conformidade

  • Adicionamos <any>, <string_view>, apply() e make_from_tuple().
  • Adicionamos <optional>, <variant>, shared_ptr::weak_type e <cstdalign>.
  • O constexpr do C++14 foi habilitado em min(initializer_list), em max(initializer_list), em minmax(initializer_list), em min_element(), em max_element() e em minmax_element().

Para saber mais, confira Conformidade com a linguagem Visual C++.

Visual Studio 2017 versão 15.3
  • Vários outras funcionalidades do C++17 foram implementadas. Para saber mais, confira Tabela de conformidade com a linguagem Microsoft C++.
  • Implementado P0602R0 "variante e opcional devem propagar a trivialidade copiar/mover".
  • A biblioteca padrão agora oficialmente tolera RTTI dinâmico sendo desabilitado por meio da opção /GR-. Tanto dynamic_pointer_cast() quanto rethrow_if_nested() exigem dynamic_cast de maneira inerente, portanto a biblioteca padrão agora os marca como =delete em /GR-.
  • Mesmo quando a RTTI dinâmica é desabilitada por meio de /GR-, a "RTTI estática" na forma de typeid(SomeType) ainda está disponível e alimenta vários componentes da biblioteca padrão. A biblioteca padrão agora também permite desabilitar esse recurso usando /D_HAS_STATIC_RTTI=0. Esse sinalizador também desabilitará std::any, as funções membro target() e target_type() de std::function e a função membro amigável get_deleter() de std::shared_ptr e de std::weak_ptr.
  • A biblioteca padrão agora usa constexpr de C++14 incondicionalmente, em vez de macros definidas condicionalmente.
  • A biblioteca padrão agora usa modelos de alias internamente.
  • A biblioteca padrão agora usa nullptr internamente, em vez de nullptr_t{}. (O uso interno de NULL foi erradicado. O uso interno de 0-as-null está sendo eliminado gradualmente.)
  • A biblioteca padrão agora usa std::move() internamente, em vez de usar std::forward() de maneira estilística indevidamente.
  • static_assert(false, "message") foi alterado por #error message. Essa alteração melhora o diagnóstico do compilador porque #error interrompe imediatamente a compilação.
  • A biblioteca padrão não marca mais funções como __declspec(dllimport). A tecnologia moderna de vinculador não exige mais isso.
  • SFINAE extraído para argumentos de modelo padrão, o que reduzia a desordem em comparação com tipos de retorno e tipos de argumento de função.
  • As verificações de depuração em <random> agora usam o maquinário usual da biblioteca padrão, em vez da função interna _Rng_abort() que chamava fputs() para stderr. A implementação dessa função é mantida para compatibilidade binária. Vamos removê-la na próxima versão incompatível de binário da biblioteca padrão.
Visual Studio 2017 versão 15.5
  • Vários recursos foram adicionados, preteridos ou removidos da biblioteca padrão para o padrão do C++17. Para saber mais, veja Melhorias de conformidade do C++ no Visual Studio.
  • Suporte experimental para os seguintes algoritmos paralelos:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • As assinaturas para os algoritmos paralelos a seguir foram adicionadas, mas não paralelizadas dessa vez. A criação de perfil não mostrou nenhum benefício na paralelização de algoritmos que somente movem ou permutam elementos:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 versão 15.6
  • <memory_resource>
  • Princípios básicos da biblioteca V1
  • Exclusão da atribuição polymorphic_allocator
  • Melhorias na dedução de argumento de modelo de classe
Visual Studio 2017 versão 15.7
  • Suporte a algoritmos paralelos não é mais experimental
  • Uma nova implementação de <filesystem>
  • Conversões elementares de cadeia de caracteres (parcial)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Evitar decaimento desnecessário
  • Funções matemáticas especiais
  • constexpr char_traits
  • Guias de dedução da biblioteca padrão

Para saber mais, confira Conformidade com a linguagem Visual C++.

Correções de desempenho e taxa de transferência

  • Fez sobrecargas basic_string::find(char) chamar traits::find apenas uma vez. Anteriormente, isso era implementado como uma pesquisa de cadeia de caracteres geral para de uma cadeia de caracteres de comprimento 1.
  • basic_string::operator== agora verifica o tamanho da cadeia de caracteres antes de comparar o conteúdo das cadeias de caracteres.
  • Removido o acoplamento de controle em basic_string, que dificultava a análise do otimizador do compilador. Para todas as cadeias de caracteres curtas, chamar reserve ainda não tem certo custo por não fazer nada.
  • std::vector foi revisado para garantir a correção e o desempenho: a atribuição de alias durante as operações de inserção e substituição agora é tratada corretamente, conforme requerido pelo Standard, a garantia de exceção forte agora é fornecida quando requerida pelo padrão por meio de move_if_noexcept() e outras lógicas, e a inserção e a substituição fazem menos operações de elementos.
  • A biblioteca padrão do C++ agora evita desreferenciar ponteiros nulos sofisticados.
  • Desempenho de weak_ptr::lock() aprimorado.
  • Para aumentar a taxa de transferência do compilador, os cabeçalhos da biblioteca padrão do C++ agora evitam incluir declarações para intrínsecos do compilador que são desnecessários.
  • Aumento mais de três vezes do desempenho dos construtores de movimento std::string e std::wstring.
Visual Studio 2017 versão 15.3
  • Solucionadas as interações com noexcept que impediam a implementação embutida de std::atomic em funções que usam o SEH (tratamento de exceções estruturado).
  • Alterada a função interna _Deallocate() da biblioteca padrão para ser otimizada em código menor, permitindo que ele seja embutido em outros locais.
  • Alterado std::try_lock() para usar a expansão de pacote em vez de recursão.
  • O algoritmo de impedimento de deadlock std::lock() foi melhorado para usar operações lock() em vez de girar em try_lock() em todos os bloqueios.
  • Habilitada a otimização de valor retornado nomeado em system_category::message().
  • conjunction e disjunction agora criam uma instância de N + 1 tipos, em vez de 2N + 2 tipos.
  • std::function não instancia mais máquinas de suporte de alocador para cada chamável apagado por tipo, melhorando a taxa de transferência e reduzindo o tamanho de .obj em programas que passam vários lambdas distintos para std::function.
  • allocator_traits<std::allocator> contém operações std::allocator manualmente embutidas, o que reduz o tamanho do código que interage com std::allocator apenas por meio de allocator_traits (ou seja, no maioria dos códigos).
  • A interface de alocador mínima C++11 agora é manipulada pela biblioteca padrão chamando allocator_traits diretamente, em vez de encapsular o alocador em uma classe interna _Wrap_alloc. Isso reduz o tamanho do código gerado compatível com o alocador, melhora a capacidade do otimizador de raciocinar sobre contêineres da Biblioteca Padrão em alguns casos e fornece uma melhor experiência de depuração (porque agora você pode ver o tipo de alocador, em vez de _Wrap_alloc<your_allocator_type> no depurador).
  • Removida a metaprogramação para allocator::reference personalizada, às quais os alocadores não têm permissão para serem personalizados. (Os alocadores podem fazer contêineres usarem ponteiros sofisticados, mas não referências sofisticadas.)
  • O front-end do compilador foi ensinado a descompactar iteradores de depuração em loops for baseados em intervalo, melhorando o desempenho de compilações de depuração.
  • O caminho de redução interna de basic_string para shrink_to_fit() e para reserve() não está mais no caminho das operações de realocação, o que reduz o tamanho do código para todos os membros de mutação.
  • O caminho de crescimento interno basic_string não está no caminho de shrink_to_fit().
  • As operações de mutação de basic_string agora são fatoradas em funções de caminho rápido de não alocação e de caminho lento de alocação, aumentando a probabilidade de o caso comum de não realocação ser embutido em chamadores.
  • As operações de mutação de basic_string agora constroem buffers realocados no estado preferido em vez do redimensionamento em vigor. Por exemplo, uma inserção no início de uma cadeia de caracteres agora move o conteúdo após a inserção exatamente uma vez. Ele é movido para baixo ou para o buffer recém-alocado. Ele não é mais movido duas vezes no caso de realocação, primeiro para o buffer recém-alocado e depois para baixo.
  • As operações chamando a biblioteca padrão C em <cadeia de caracteres> agora armazena em cache o endereço errno para remover interações repetidas com TLS.
  • Implementação is_pointer simplificada.
  • Concluída a alteração da expressão SFINAE baseada em função para baseada em struct e em void_t.
  • Os algoritmos de biblioteca padrão agora evitam iteradores de pós-incrementação.
  • Corrigidos os avisos de truncamento ao usar alocadores de 32 bits em sistemas de 64 bits.
  • A atribuição de movimentação std::vector agora é mais eficiente para o caso de alocador não igual a não POCMA reutilizando o buffer quando possível.
Visual Studio 2017 versão 15.5
  • basic_string<char16_t> agora aciona o mesmo memcmp, memcpy e otimizações semelhantes que acionam basic_string<wchar_t>.
  • Uma limitação do otimizador que impedia os ponteiros de função de serem embutidos e que foi exposta pelo nosso trabalho "evitar a cópia de funções" no Visual Studio 2015 Atualização 3 foi solucionada, restaurando o desempenho de lower_bound(iter, iter, function pointer).
  • A sobrecarga da verificação da ordem de entradas da depuração do iterador para includes, set_difference, set_symmetric_difference e set_union foi reduzida desencapsulando iteradores antes de verificar a ordem.
  • std::inplace_merge agora ignora elementos que já estão no lugar.
  • Construir std::random_device agora não constrói e, em seguida, destrói um std::string.
  • std::equal e std::partition tinham uma passagem de otimização de jump-threading que salvava uma comparação de iterador.
  • Quando std::reverse recebe ponteiros para T trivialmente copiável, ele agora envia para uma implementação vetorizada escrita à mão.
  • std::fill, std::equal e std::lexicographical_compare foram ensinados a enviar a memset e a memcmp para std::byte e para gsl::byte (e outras classes de enumeração e enumerações similares a char). Como std::copy envia usando is_trivially_copyable, ele não precisa de nenhuma alteração.
  • A biblioteca padrão não contém mais destruidores com chaves vazias cujo único comportamento era tornar os tipos em não facilmente destrutíveis.

Outras bibliotecas

Suporte à biblioteca de software livre

Vcpkg é uma ferramenta de linha de comando de software livre que simplifica bastante o processo de aquisição e de compilação de bibliotecas estáticas e de DLLS de software livre do C++ no Visual Studio. Para obter mais informações, confira vcpkg.

CPPRest SDK 2.9.0

Visual Studio 2017 versão 15.5

O CPPRestSDK, uma API da Web multiplataforma para C++, foi atualizado para a versão 2.9.0. Para obter mais informações, consulte CppRestSDK 2.9.0 está disponível no GitHub.

ATL

Visual Studio 2017 versão 15.5
  • Ainda outro conjunto de correções de compatibilidade de pesquisa de nome
  • Os construtores de movimentação existentes e os operadores de atribuição de movimentação agora são marcados adequadamente como não lançadores de exceções
  • Não suprimir aviso C4640 válido sobre a inicialização segura de thread de estatísticas locais no atlstr.h
  • A inicialização thread-safe de estatísticas locais era desabilitada automaticamente no conjunto de ferramentas XP ao usar ATL para compilar uma DLL. Agora não é mais. Você pode adicionar /Zc:threadSafeInit- às configurações do Projeto se não quiser a inicialização thread-safe.

runtime do Visual C++

  • Novo cabeçalho "cfguard.h" para símbolos de proteção de fluxo de controle.

IDE de C++ do Visual Studio 2017

  • Agora, o desempenho de alteração de configuração é melhor para projetos nativos C++ e muito melhor para projetos C++/CLI. Quando uma configuração de solução é ativada pela primeira vez, ela é mais rápida, e todas as ativações posteriores dessa configuração de solução são quase instantâneas.
Visual Studio 2017 versão 15.3
  • Vários assistentes de código e de projeto foram reescritos no estilo de caixa de diálogo de assinatura.
  • Adicionar Classe agora inicia o assistente para Adicionar Classe diretamente. Todos os outros itens que estavam anteriormente aqui agora estão disponíveis em Adicionar > Novo Item.
  • Os projetos do Win32 agora estão na categoria Área de Trabalho do Windows na caixa de diálogo Novo Projeto.
  • Os modelos de Console do Windows e de Aplicativo da Área de Trabalho agora criam projetos sem exibir um assistente. Há um novo Assistente de Área de Trabalho do Windows na mesma categoria que exibe as mesmas opções que o antigo assistente Aplicativo de Console do Win32.
Visual Studio 2017 versão 15.5

Diversas operações C++ que usam o mecanismo IntelliSense para refatoração e navegação de código são executadas muito mais rápido. Os números a seguir se baseiam na solução do Visual Studio Chromium com 3500 projetos:

Recurso Melhoria de desempenho
Renomear 5.3x
Alterar assinatura 4.5x
Localizar Todas as Referências 4.7x

O C++ agora é compatível com Ctrl + Clique em Ir para Definição, facilitando a navegação do mouse para definições. O Visualizador de Estrutura do pacote de Ferramentas Avançadas de Produtividade agora também está incluído no produto por padrão.

IntelliSense

  • O novo mecanismo de banco de dados com base em SQLite agora está sendo usado por padrão. O novo mecanismo acelera operações de banco de dados, como Ir para Definição e Localizar Todas as Referências. Ele melhora significativamente o tempo de análise da solução inicial. A configuração foi movida para Ferramentas > Opções > Editor de texto > C/C++ > Avançado. (Anteriormente estava em... C/C++ > Experimental.)

  • Melhoramos o desempenho do IntelliSense em projetos e arquivos que não usam cabeçalhos pré-compilados; um cabeçalho pré-compilado automático é criado para cabeçalhos no arquivo atual.

  • Adicionamos filtragem de erros e ajuda para erros do IntelliSense e na lista de erros. Agora, ao clicar na coluna de erro é possível filtrar. Além disso, clicar nos erros específicos ou pressionar F1 inicia uma pesquisa online para a mensagem de erro.

    Error List.

    Error List Filtered.

  • Adicionada a capacidade de filtrar por tipo os itens da Lista de Membros.

    Member List Filtering.

  • Adicionado um novo recurso experimental Predictive IntelliSense, que fornece filtragem ciente de contexto daquilo que aparece na Lista de Membros. Para saber mais, confira Melhorias do IntelliSense no C++ – IntelliSense Preditivo e Filtragem.

  • Localizar Todas as Referências (Shift+F12) agora ajuda a movimentar-se facilmente, até mesmo em bases de código complexas. Ela fornece agrupamento, filtragem, classificação e pesquisa avançada nos resultados e, para algumas linguagens, colorização, para que você obtenha uma compreensão clara de suas referências. Para o C++, a nova interface do usuário inclui informações sobre se estamos lendo de uma variável ou gravando em uma variável.

  • O recurso Dot-to-Arrow do IntelliSense passou de experimental para avançado e agora está habilitado por padrão. Os recursos do editor Expandir Escopos e Expandir Precedência passaram de experimental para avançado.

  • As funcionalidades de refatoração experimentais Alterar Assinatura e Extrair Função agora estão disponíveis por padrão.

  • Adicionada uma funcionalidade experimental "Carregamento de projeto mais rápido" para projetos C++. Na próxima vez que você abrir um projeto C++, ele será carregado mais rapidamente e, depois disso, ele será carregado muito mais rapidamente!

  • Alguns desses recursos são comuns a outras linguagens e alguns são específicos do C++. Para saber mais sobre essas novas funcionalidades, veja Anúncio do Visual Studio "15" Preview 5.

Visual Studio 2017 versão 15.7

Projetos não MSBuild com Abrir Pasta

O Visual Studio 2017 apresenta a funcionalidade Abrir Pasta. Ela permite codificar, compilar e depurar em uma pasta que contém o código-fonte sem a necessidade de criar soluções ou projetos. Agora é mais simples começar a usar o Visual Studio, mesmo que seu projeto não seja baseado no MSBuild. Abrir Pasta oferece acesso a funcionalidades avançadas de compreensão, edição, construção e depuração de código. São as mesmas que o Visual Studio já fornece para projetos do MSBuild. Para saber mais, veja Projetos Open Folder para C++.

  • Melhorias na experiência de Abrir Pasta. Você pode personalizar a experiência por meio destes arquivos .json:
    • CppProperties.json para personalizar a experiência de navegação e do IntelliSense.
    • Tasks.json para personalizar as etapas de build.
    • Launch.json para personalizar a experiência de depuração.
Visual Studio 2017 versão 15.3
  • Suporte aprimorado para ambientes de compilação e compiladores alternativos como MinGW e Cygwin. Para saber mais, veja Usando MinGW e Cygwin com Visual C++ e Abrir Pasta.
  • Adicionado compatibilidade para definir variáveis de ambiente globais e específicas de configuração em CppProperties.json e em CMakeSettings.json. Essas variáveis de ambiente podem ser consumidas por configurações de depuração definidas em launch.vs.json e em tarefas em tasks.vs.json. Para saber mais, veja Personalizando seu ambiente com o Visual C++ e Abrir Pasta.
  • Suporte aprimorado para o gerador Ninja do CMake, incluindo a capacidade de direcionar facilmente plataformas de 64 bits.

Suporte a CMake através do Open Folder

O Visual Studio 2017 apresenta suporte ao uso de projetos CMake sem a conversão para arquivos de projeto MSBuild (.vcxproj). Para saber mais, confira Projetos CMake no Visual Studio. Abrir projetos CMake com Abrir Pasta configurará automaticamente o ambiente para editar, compilar e depurar com o C++.

  • O C++ IntelliSense funciona sem a necessidade de criar um arquivo CppProperties.json na pasta raiz. Adicionamos uma nova lista suspensa para permitir que os usuários alternem facilmente entre as configurações fornecidas pelos arquivos CMake e CppProperties.json.

  • Há suporte para configurações adicionais por meio de um arquivo CMakeSettings.json que reside na mesma pasta que o arquivo CMakeLists.txt.

    CMake Open Folder.

Visual Studio 2017 versão 15.3
  • Suporte adicionado para o gerador Ninja do CMake.
Visual Studio 2017 versão 15.4
  • Suporte adicionado para importação de caches de CMake existentes.
Visual Studio 2017 versão 15.5

Desenvolvimento da área de trabalho do Windows

Agora, fornecemos uma experiência de instalação mais granular da carga de trabalho original do C++. Adicionamos componentes selecionáveis que permitem instalar apenas as ferramentas que você precisa. Os tamanhos de instalação indicados para os componentes listados na interface de usuário do instalador estão incorretos e subestimam o tamanho total.

Para criar projetos Win32 com êxito na carga de trabalho de área de trabalho C++, é necessário instalar um conjunto de ferramentas e um SDK do Windows. Instalar os componentes recomendados (selecionados) Conjunto de ferramentas do VC++ 2017 v141 (x86, x64) e SDK do Windows 10 (10.0.nnnnn) garantirá que isso funcionará. Se as ferramentas necessárias não estiverem instaladas, os projetos não serão criados com êxito e o assistente deixará de responder.

Visual Studio 2017 versão 15.5

As Ferramentas de Build do Visual C++ (anteriormente disponíveis como um produto autônomo) agora estão incluídas como uma carga de trabalho no Instalador do Visual Studio. Essa carga de trabalho instala somente as ferramentas necessárias para compilar projetos C++ sem instalar o IDE do Visual Studio. Ambos os conjuntos de ferramentas v140 e v141 estão incluídos. O conjunto de ferramentas v141 contém as melhorias mais recentes do Visual Studio 2017 versão 15.5. Para obter mais informações, consulte As Ferramentas de Build do Visual Studio agora incluem o VS2017 e Conjuntos de Ferramentas do VS2015 MSVC.

Desenvolvimento de Linux com C++

A extensão popular Visual C++ para Desenvolvimento no Linux agora faz parte do Visual Studio. Essa instalação fornece tudo o que você precisa para desenvolver e depurar aplicativos em C++, em execução em um ambiente Linux.

Visual Studio 2017 versão 15.2

Foram feitos aprimoramentos no compartilhamento de código multiplataforma e na visualização de tipos. Para saber mais, veja Aprimoramentos do C++ para Linux para compartilhamento de código entre plataformas e visualização de tipo.

Visual Studio 2017 versão 15.5
  • A carga de trabalho do Linux adicionou suporte ao rsync como alternativa ao sftp para sincronizar arquivos com computadores Linux remotos.
  • Foi adicionado suporte compilação cruzada direcionada a microcontroladores ARM. Para habilitar isso na instalação, escolha a carga de trabalho Desenvolvimento para Linux com C++ e selecione a opção para Desenvolvimento Incorporado e de IoT. Essa opção adiciona as ferramentas de compilação cruzada do ARM GCC e Make à sua instalação. Para obter mais informações, consulte Compilação cruzada do ARM GCC no Visual Studio.
  • Foi adicionado o suporte a CMake. Agora, você pode trabalhar em sua base de código existente do CMake sem precisar convertê-la em um projeto do Visual Studio. Para obter mais informações, consulte Configurar um projeto do Linux CMake.
  • Foi adicionado suporte à execução de tarefas remotas. Essa funcionalidade permite executar qualquer comando em um sistema remoto definido no Gerenciador de Conexões do Visual Studio. As tarefas remotas também fornecem a capacidade de copiar arquivos para o sistema remoto. Para obter mais informações, consulte Configurar um projeto do Linux CMake.
Visual Studio 2017 versão 15.7

Desenvolvimento de jogos com C++

Use todo o poder do C++ para compilar jogos profissionais com DirectX ou Cocos2d.

Desenvolvimento móvel com C++ para Android e iOS

Agora, você pode criar e depurar aplicativos móveis usando o Visual Studio, que pode ser destinado ao Android e iOS.

Aplicativos universais do Windows

O C++ é fornecido como um componente opcional para a carga de trabalho do Aplicativo Universal do Windows. Atualmente, você deve atualizar projetos C++ manualmente. Você pode abrir um projeto de Plataforma Universal do Windows de destino v140 no Visual Studio 2017. Porém, será necessário selecionar o conjunto de ferramentas de plataforma v141 nas páginas de propriedades do projeto se o Visual Studio 2015 não estiver instalado.

Novas opções para C++ na UWP (Plataforma Universal do Windows)

Agora existem novas opções para gravar e empacotar aplicativos do C++ para a Plataforma Universal do Windows e para a Windows Store: a infraestrutura de Ponte de Desktop permite empacotar o objeto COM ou o aplicativo da área de trabalho existente para implantação por meio da Windows Store. Ou, para implantação por meio de seus canais existentes via sideload. Novos recursos no Windows 10 permitem que você adicione a funcionalidade UWP para seu aplicativo de área de trabalho de várias maneiras. Para saber mais, veja Ponte de Desktop.

Visual Studio 2017 versão 15.5

Foi adicionado um modelo de projeto do Projeto de Empacotamento de Aplicativo do Windows, que simplifica muito o empacotamento de aplicativos de área de trabalho usando a Ponte de Desktop. Ele está disponível em Arquivo | Novo | Projeto | Instalado | Visual C++ | Plataforma Universal do Windows. Para saber mais, veja Empacotar um aplicativo usando o Visual Studio (Ponte de Desktop).

Ao escrever código novo, você pode usar a C++/WinRT, uma projeção de linguagem C++ padrão para o Windows Runtime implementada exclusivamente em arquivos de cabeçalho. Ela permite consumir e criar APIs do Windows Runtime usando qualquer compilador C++ em conformidade com os padrões. A C++/WinRT foi concebida para oferecer aos desenvolvedores em C++ um acesso de primeira classe à moderna API do Windows. Para obter mais informações, confira C++/WinRT.

A partir do build 17025 do SDK do Windows Insider Preview, o C++/WinRT está incluído no SDK do Windows. Para obter mais informações, consulte C++/WinRT agora está incluído no SDK do Windows.

O conjunto de ferramentas de plataforma Clang/C2

O conjunto de ferramentas Clang/C2 que acompanha o Visual Studio 2017 agora dá suporte à opção /bigobj, essencial para a criação de projetos grandes. Ele também inclui várias correções de bugs importantes, tanto no front-end quanto no back-end do compilador.

Análise de código C++

Os verificadores principais do C++ para impor as principais diretrizes do C++ agora são distribuídas com o Visual Studio. Habilita os verificadores na página de Extensões do Code Analysis de propriedades de projeto. As extensões são incluídas quando a análise de código é executada. Para saber mais, veja Uso dos verificadores de diretrizes de núcleo do C++.

Screenshot of the Property Pages dialog box showing Configuration Properties > Code Analysis > General selected and a number of Core Checks listed in teh Run this rule set section.

Visual Studio 2017 versão 15.3
  • Adicionada compatibilidade com regras relacionadas ao gerenciamento de recursos.
Visual Studio 2017 versão 15.5
  • As novas verificações das Diretrizes Principais do C++ abrangem a exatidão do ponteiro inteligente, o uso correto de inicializadores globais e os usos das sinalizações de usos de constructos como goto e conversões incorretas.

  • Alguns números de aviso que você pode encontrar na versão 15.3 não estão mais disponíveis na versão 15.5. Esses avisos foram substituídos por verificações mais específicas.

Visual Studio 2017 versão 15.6
Visual Studio 2017 versão 15.7

Unit Testing no Visual Studio 2017

Visual Studio 2017 versão 15.5

Os adaptadores do Google Test e do Boost.Test agora estão disponíveis como componentes da carga de trabalho de Desenvolvimento para Área de Trabalho com C++. Eles são integrados ao Gerenciador de Testes. Foi adicionado o suporte a CTest para projetos CMake (usando Abrir Pasta), embora a integração total com o Gerenciador de Testes ainda não esteja disponível. Para obter mais informações, consulte Escrevendo testes de unidade para C/C++.

Visual Studio 2017 versão 15.6
  • Adicionado o suporte à biblioteca dinâmica Boost.Test.
  • Um modelo de item Boost.Test já está disponível no IDE.

Para obter mais informações, consulte Boost.TestTeste de unidade: suporte à biblioteca dinâmica e novo modelo de item.

Visual Studio 2017 versão 15.7

Suporte de CodeLens adicionado para projetos de teste de unidade do C++. Para obter mais informações, veja Apresentação do CodeLens para teste de unidade do C++.

Diagnóstico de gráficos do Visual Studio

Ferramentas de Diagnóstico de Gráficos do Visual Studio: você pode usá-las para registrar e analisar problemas de renderização e desempenho em aplicativos Direct3D. Use-as em aplicativos executados localmente em seu PC Windows, em um emulador de dispositivo Windows ou em um PC ou dispositivo remoto.

  • Entrada e saída para sombreadores de vértice e de geometria: a capacidade de exibir a entrada e saída de sombreadores de vértices e sombreadores de geometria tem sido um dos recursos mais solicitados. Agora há suporte nas ferramentas. Selecione o estágio VS ou GS na exibição de Estágios da Pipeline para iniciar a inspeção de sua entrada e saída na tabela abaixo.

    Input/Output for shaders.

  • Pesquisa e filtro na tabela de objetos: fornece uma maneira rápida e fácil de localizar os recursos que você está procurando.

    Screenshot of the Object Table section with the Type drop-down and Search text box called out.

  • Histórico de Recursos: esse novo modo de exibição fornece uma maneira simplificada de ver todo o histórico de modificações de um recurso, enquanto ele foi usado durante a renderização de um quadro capturado. Para invocar o histórico de qualquer recurso, clique no ícone de relógio ao lado de qualquer hiperlink de recurso.

    Resource history.

    Será exibida uma nova janela de ferramentas Histórico de Recursos, preenchida com o histórico de alterações do recurso.

    Resource history change.

    É possível capturar quadros com a captura completa da pilha de chamadas habilitada. Isso permite deduzir rapidamente o contexto de cada evento de alteração e inspecioná-lo no projeto do Visual Studio. Defina a opção de captura de pilha completa na caixa de diálogo Opções de Ferramentas > do Visual Studio em Diagnóstico de Gráficos.

  • Estatísticas de API: exibir um resumo de alto nível do uso da API em seu quadro. É útil para descobrir chamadas que você talvez não perceba que está fazendo, ou chamadas que está fazendo com muita frequência. Esta janela está disponível por meio de Exibir > Estatísticas de API no Analisador de Gráficos do Visual Studio.

    API stats.

  • Estatísticas de Memória: exibir a quantidade de memória que o driver aloca para os recursos que você cria no quadro. Esta janela está disponível por meio de Exibir > Estatísticas de Memória no Analisador de Gráficos do Visual Studio. Para copiar dados para um arquivo CSV para exibição em uma planilha, clique com o botão direito do mouse e escolha Copiar Tudo.

    Memory stats.

  • Validação de Quadro: a nova lista de erros e avisos fornece uma maneira fácil de navegar em sua lista de eventos com base em problemas potenciais detectados pela camada de depuração Direct3D. Clique em Exibir > Validação de Quadro no Analisador de Gráficos do Visual Studio para abrir a janela. Em seguida, clique em Executar Validação para iniciar a análise. Pode levar vários minutos para a análise ser concluída, dependendo da complexidade do quadro.

    Frame validation.

  • Análise de Quadros para D3D12: use a Análise de Quadros para analisar o desempenho da chamada de desenho com experimentos “what-if” direcionados. Mudar para a guia de Análise de Quadros e executar uma análise para exibir o relatório.

    Frame analysis.

  • Melhorias no uso da GPU: os rastreamentos abertos podem ser obtidos através do perfil de uso da GPU do Visual Studio com o GPUView ou com a ferramenta Windows Performance Analyzer (WPA) para uma análise mais detalhada. Se você tiver o Windows Performance Toolkit instalado, haverá dois hiperlinks: um para o WPA e outro para o GPUView, no canto inferior direito da visão geral da sessão.

    GPU usage.

    Os rastreamentos que você abre no GPUView por meio desse link dão suporte para zoom e panorâmica sincronizados da linha do tempo do VS e do GPUView. Uma caixa de seleção no VS controla se a sincronização está habilitada ou não.

    GPUView.