Escolar Documentos
Profissional Documentos
Cultura Documentos
NOTE
Esta documentação do desenvolvedor se aplica Visual Studio 2019. Para ver a documentação de sua versão preferencial
do Visual Studio, use o controle Seletor de versão. Ele é encontrado na parte superior do conteúdo desta página.
Se você estiver procurando um pacote redistribuível do Microsoft Visual C++ 2019 para que possa executar um
programa, acesse a página Downloads do Microsoft Visual Studio site. Em Todos os Downloads , expanda a seção
Outras Ferramentas, Estruturas e Redistribuíveis. Selecione sua arquitetura de destino e, em seguida, escolha o
botão Baixar.
Para redistribuíveis mais antigos, abra a página Downloads mais antigos. Expanda a seção Outras Ferramentas,
Estruturas e Redistribuíveis. Encontre a versão redistribuível que você deseja baixar, selecione sua arquitetura de
destino e, em seguida, escolha o botão Baixar.
NOTE
Esta documentação do desenvolvedor se aplica Visual Studio 2017. Para ver a documentação de sua versão preferencial
do Visual Studio, use o controle Seletor de versão. Ele é encontrado na parte superior do conteúdo desta página.
Se você estiver procurando um pacote redistribuível Microsoft Visual C++ 2017 ou mais antigo para que possa executar
um programa, acesse a página Downloads mais antigos do site do Microsoft Visual Studio. Expanda a seção Outras
Ferramentas, Estruturas e Redistribuíveis. Encontre a versão redistribuível que você deseja baixar, selecione sua
arquitetura de destino e, em seguida, escolha o botão Baixar.
NOTE
Esta documentação do desenvolvedor se aplica Visual Studio 2015. Para ver a documentação de sua versão preferencial
do Visual Studio, use o controle Seletor de versão. Ele é encontrado na parte superior do conteúdo desta página.
Se você estiver procurando um pacote redistribuível Microsoft Visual C++ 2015 ou mais antigo para que possa executar
um programa, acesse a página Downloads mais antigos do site do Microsoft Visual Studio. Expanda a seção Outras
Ferramentas, Estruturas e Redistribuíveis. Encontre a versão redistribuível que você deseja baixar, selecione sua
arquitetura de destino e, em seguida, escolha o botão Baixar.
Referência de linguagens
Referência da linguagem C++
O guia de referência para a implementação da Microsoft da linguagem de programação C++.
Referência do pré-processador C/C++
Uma referência comum ao pré-processador de linguagem C e C++ compartilhado.
Referência da linguagem C
O guia de referência para a implementação da Microsoft da linguagem de programação C.
Intrínsecos do compilador e linguagem de assembly
Guias para os intrínsecos do compilador com suporte ou implementados pelos compiladores do Microsoft
C/C++ em cada plataforma.
Comentários e comunidade
Microsoft Docs Q&A
Microsoft Docs hospeda fóruns pesquisáveis para perguntas e respostas. Adicione uma C++ marca à sua
postagem para assistência da comunidade sobre problemas relacionados ao C++.
Como relatar um problema com o pacote de ferramentas do Microsoft C/C++
Saiba como criar relatórios de erros efetivos no microsoft C/C++ (compilador, linker e outras ferramentas) e
maneiras de enviar seu relatório.
Blog da equipe do Microsoft C++
Saiba mais sobre os novos recursos e as informações mais recentes dos desenvolvedores das ferramentas do
C++ no Visual Studio.
Visual Studio C++ Developer Community
Obter ajuda, arquivar bugs e fazer sugestões para C++ Visual Studio.
Visão geral do desenvolvimento em C++ no Visual
Studio
30/07/2021 • 6 minutes to read
Como parte do IDE (Ambiente de Desenvolvimento Integrado) do Visual Studio, o MSVC (Microsoft C++)
compartilha muitas janelas e ferramentas com outras linguagens. Muitas delas, incluindo o Gerenciador de
Soluções , o editor de códigos e o depurador, estão documentadas no IDE do Visual Studio. Geralmente, uma
ferramenta ou uma janela compartilhada tem um conjunto de recursos ligeiramente diferente para o C++
comparado a outra linguagens. Algumas janelas ou ferramentas só estão disponíveis no Visual Studio
Professional ou nas edições do Visual Studio Enterprise.
Além das ferramentas compartilhadas no IDE do Visual Studio, o MSVC tem várias ferramentas especificamente
para o desenvolvimento de código nativo. Essas ferramentas também são listadas neste artigo. Para obter uma
lista de quais ferramentas estão disponíveis em cada edição do Visual Studio, confira Ferramentas e recursos do
C++ em edições do Visual Studio.
Criar projetos
Um projeto é basicamente um conjunto de arquivos de código-fonte e recursos, como imagens ou arquivos de
dados que são compilados em um programa ou biblioteca executável.
O Visual Studio dá suporte a qualquer sistema de projeto ou ferramenta de build personalizada que você deseje
usar, com suporte total para IntelliSense, navegação e depuração:
O MSBuild é o sistema de projeto nativo para o Visual Studio. ao selecionar arquivo > novo > Project
no menu principal, você verá muitos tipos de modelos de projeto de MSBuild que o ajudarão a
desenvolver rapidamente diferentes tipos de aplicativos em C++.
Em geral, você deve usar esses modelos para novos projetos, a menos que esteja usando projetos CMake
ou outro sistema de projeto. Para saber mais, confira Criar e gerenciar projetos baseados no MSBuild.
o CMake é um sistema de build de plataforma cruzada que é integrado ao IDE Visual Studio quando
você instala o desenvolvimento de Desktop com a carga de trabalho do C++. É possível usar o modelo de
projeto CMake para novos projetos ou simplesmente abrir uma pasta com um arquivo CMakeLists.txt.
Para saber mais, confira Projetos CMake no Visual Studio.
Qualquer outro sistema de compilação C++, incluindo uma coleção flexível de arquivos, tem suporte por
meio do recurso abrir pasta . Crie arquivos JSON simples para invocar o programa de build e
configurar sessões de depuração. Para saber mais, veja Projetos Open Folder para C++.
Obter bibliotecas
Use o gerenciador de pacotes vcpkg para obter e instalar bibliotecas de terceiros. No momento, mais de 900
bibliotecas open-source estão disponíveis no catálogo.
Escrever código
Depois que você cria um projeto, todos os arquivos de projeto são exibidos na janela Gerenciador de
Soluções . (Uma solução é um contêiner lógico para um ou mais projetos relacionados.) Quando você clica em
um arquivo. h ou. cpp em Gerenciador de soluções , o arquivo é aberto no editor de código.
O editor de códigos é um processador de texto especializado para código-fonte C++. Ele codifica por cores os
nomes de palavras-chave, de métodos e de variáveis da linguagem e outros elementos do código para tornar o
código mais legível e mais fácil de ser entendido. Ele também fornece ferramentas para refatoração de código,
navegação entre diferentes arquivos e noções básicas sobre como o código é estruturado. Para saber mais,
confira Escrever e refatorar código.
Para saber mais sobre como configurar builds, confira Como trabalhar com Propriedades de Projeto e Projetos e
sistemas de build.
Use também o compilador (cl.exe) e muitas outras ferramentas autônomas relacionadas a build, como NMAKE e
LIB, diretamente na linha de comando. Para obter mais informações, confira Compilar o código C/C++ na linha
de comando e Referência de build do C/C++.
Depurar
É possível iniciar a depuração pressionando F5 . A execução pausa em todos os pontos de interrupção que você
definiu (pressionando F9 ). Você também pode percorrer o código uma linha por vez (F10 ), exibir os valores das
variáveis ou dos registros e, mesmo em alguns casos, fazer alterações no código e continuar a depuração sem
precisar compilá-la novamente. A ilustração a seguir mostra uma sessão de depuração em que a execução é
pausada no ponto de interrupção. Os valores dos membros da estrutura de dados são visíveis na janela
Inspeção .
Para obter mais informações, consulte Depuração no Visual Studio.
Teste
O Visual Studio inclui o Microsoft Unit Test Framework para C++, além de suporte para Boost.Test, Google Test e
CTest. Execute os testes na janela do Gerenciador de Testes :
Para saber mais, confira Verificar código usando testes de unidade e Gravar testes de unidade para C/C++ no
Visual Studio.
Analisar
O Visual Studio inclui ferramentas de análise de código estático que podem detectar possíveis problemas no
código-fonte. Essas ferramentas incluem uma implementação dos verificadores de regras das Diretrizes
Principais do C++. Para obter mais informações, confira Visão geral da análise de código do C/C++.
Próximas etapas
Explore ainda mais o Visual Studio seguindo um dos seguintes artigos introdutórios:
Saiba como usar o editor de códigos
Saiba mais sobre projetos e soluções
Novidades do C++ no Visual Studio
13/05/2021 • 31 minutes to read
O Visual Studio 2019 traz muitas atualizações e correções para o ambiente do Microsoft C++. Corrigimos vários
bugs e problemas no compilador e nas ferramentas. Muitos deles 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 2019. Para saber
mais sobre novidades de C++ no Visual Studio 2017, confira Novidades de C++ no Visual Studio 2017. 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 C++ docs: What ' s New.
Suporte estendido para IntelliSense de módulos C++20, incluindo Ir para Definição, Ir para Módulo e
conclusão de membro.
Agora há suporte para modelos de função abreviados no compilador MSVC.
Maior capacidade de localizar os modelos de função por meio de pesquisa dependente de argumento
para expressões de chamada de função com argumentos de modelo explícitos (P0846R0).
Inicialização designada (P0329R4), que permite que membros específicos sejam selecionados na
inicialização de agregação, por exemplo, usando a Type t { .member = expr } sintaxe.
O suporte a lambda foi revisado, resolvendo um grande número de bugs de longa data. Essa alteração é
habilitada por padrão ao usar o /std:c++latest . No /std:c++17 modo de linguagem e no modo padrão
( /std:c++14 ), o novo analisador pode ser habilitado usando /experimental:newLambdaProcessor , por
exemplo, /std:c++17 /experimental:newLambdaProcessor .
Melhorias da biblioteca padrão do C++
Esses recursos de visualização do C++ 20 foram adicionados à nossa implementação da biblioteca padrão
do C++, disponível em /std:c++latest :
starts_with e ends_with para basic_string e basic_string_view .
contains para contêineres associativos.
remove , remove_if , e unique para list e forward_list agora retornam size_type .
shift_left e shift_right adicionados a <algorithm> .
C++ IDE
IntelliCode paraC++
O IntelliCode agora é fornecido como um componente opcional na carga de trabalho Desenvolvimento para
desktop com C++ . Para saber mais, confira IntelliCode aprimorado para C++ agora vem com o Visual Studio
2019.
O IntelliCode usa seu próprio treinamento extensivo e seu contexto de código para colocar o que você mais
provavelmente usará na parte superior da sua lista de conclusão. Frequentemente, ele é capaz de eliminar a
necessidade de rolar para baixo na lista. Para C++, o IntelliCode oferece a maior ajuda quando você está usando
bibliotecas populares como a biblioteca padrão.
Os recursos de visualização do IntelliCode (modelos personalizados, suporte a C++ e inferência de
EditorConfig) estão desabilitados por padrão. Para habilitá-los, acesse ferramentas > opções > IntelliCode
> geral . Esta versão do IntelliCode tem precisão melhorada e inclui suporte para funções gratuitas. Para obter
mais informações, consulte Sugestões de preenchimento de código auxiliadas por IA para C++ usando
IntelliCode.
Aprimoramentos de informações rápidas
A dica de ferramenta Informações Rápidas agora respeita a colorização semântica do seu editor. Ela também
apresenta um novo link para Pesquisa Online , que pesquisará documentos online que traga mais
informações sobre o constructo de código focalizado. O link fornecido pelas informações rápidas para
código vermelho-ondulado procurará o erro online. Dessa forma, você não precisa digitar a mensagem
novamente no navegador. Para obter mais informações, consulte melhorias de informações rápidas no Visual
Studio 2019: colorização e pesquisa online.
Aprimoramentos gerais
A Barra de Modelo pode preencher o menu suspenso com base em instanciações desse modelo em sua
base de código.
Lâmpadas para diretivas ausentes #include que o vcpkg pode instalar e preenchimento automático de
pacotes disponíveis para a find_package diretiva CMake.
A página de propriedades geral para projetos C++ foi revisada. Algumas opções agora estão listadas em
uma nova página avançada . A página avançado também inclui novas propriedades para sua
arquitetura de conjunto de ferramentas preferida, bibliotecas de depuração, a versão secundária do
conjunto de ferramentas MSVC e compilações de Unity (Jumbo).
Suporte para CMake
Atualizamos a versão do CMake que acompanha o Visual Studio para 3,14. Esta versão adiciona suporte
interno para geradores de MSBuild direcionados a projetos do Visual Studio 2019, bem como APIs de
integração de IDE baseado em arquivo.
Adicionamos melhorias ao editor de configurações do CMake, incluindo suporte para o WSL (subsistema
do Windows para Linux) e configurações de caches existentes, alterações nas raízes de compilação e
instalação padrão e suporte para variáveis de ambiente nas configurações do Linux CMake.
As conclusões e as informações rápidas para comandos, variáveis e propriedades de CMake internas
facilitam a edição dos CMakeLists.txt arquivos.
Integramos o suporte para edição, criação e depuração de projetos CMake com Clang/LLVM. Para saber
mais, veja Suporte a Clang/LLVM no Visual Studio.
Linux e o Subsistema do Windows para Linux
Agora, damos suporte a AddressSanitizer (ASan) em projetos de plataforma cruzada Linux e CMake. Para
saber mais, confira AddressSanitizer (ASan) para carga de trabalho do Linux no Visual Studio 2019.
Integramos o suporte do Visual Studio ao uso do C++ com o subsistema do Windows para Linux (WSL).
Agora você pode usar sua instalação local do subsistema do Windows para Linux (WSL) com o C++
nativamente no Visual Studio sem configuração adicional ou uma conexão SSH. Para saber mais, confira
C++ com Visual Studio 2019 e subsistema Windows para Linux (WSL).
Análise de Código
Foram adicionadas novas correções rápidas para verificações de variáveis não inicializadas. Avisos de análise
de código C6001: usando < variáveis > de memória não inicializadas e C26494 VAR_USE_BEFORE_INIT estão
disponíveis no menu de lâmpada em linhas relevantes. Eles estão habilitados por padrão no conjunto de
regras de tipo de conjunto de regras mínimo nativo da Microsoft e Verificação Principal do C++,
respectivamente. Para saber mais, confira Novas correções rápidas de análise de código para memória não
inicializada (C6001) e avisos de uso antes da inicialização (C26494).
Builds remotos
Agora os usuários podem separar computadores de build remoto de computadores de depuração
remota ao direcionar para Linux, em projetos do MSBuild e do CMake.
O log aprimorado para conexões remotas torna mais fácil diagnosticar problemas no desenvolvimento
de plataforma cruzada.
Otimizado o design físico de biblioteca padrão para evitar a compilação de partes da biblioteca padrão
não incluídas diretamente. Essa alteração reduz o tempo de compilação de um arquivo vazio que inclui
apenas <vector> na metade. Como consequência, talvez você precise adicionar diretivas #include aos
cabeçalhos que foram incluídos anteriormente de maneira indireta. Por exemplo, o código que usa
std::out_of_range agora pode precisar de #include <stdexcept> . O código que usa um operador de
inserção de fluxo agora pode precisar de #include <ostream> . O benefício é que apenas as unidades de
tradução que realmente usam <stdexcept> ou <ostream> componentes pagam o custo da taxa de
transferência para compilá-las.
if constexpr foi aplicado em mais lugares na biblioteca padrão para aumento da taxa de transferência e
redução do tamanho do código em operações de cópia, em permutações como reverter e girar, e na
biblioteca de algoritmos paralelos.
A biblioteca padrão agora usa if constexpr internamente para reduzir os tempos de compilação,
mesmo no modo C++14.
A detecção de vinculação dinâmica do runtime para a biblioteca de algoritmos paralelos não usa mais
uma página inteira para armazenar a matriz do ponteiro de função. Marcar essa memória como somente
leitura deixou de ser considerado relevante para fins de segurança.
O std::thread Construtor não aguarda mais que o thread seja iniciado e não insere mais tantas
camadas de chamadas de função entre a biblioteca C subjacente _beginthreadex e o objeto chamável
fornecido. Anteriormente std::thread , colocamos seis funções entre _beginthreadex o e o objeto
chamável fornecido. Esse número foi reduzido para apenas três, dois dos quais são apenas std::invoke .
Essa alteração também resolve um bug de tempo obscuro, onde um std::thread Construtor deixaria de
responder se o relógio do sistema fosse alterado no momento exato em std::thread que estava sendo
criado.
Correção de uma regressão de desempenho em std::hash que introduzimos ao implementar
std::hash<std::filesystem::path> .
A biblioteca padrão usa destruidores em vez de blocos catch em diversos lugares para chegar à exatidão.
Essa alteração resulta em melhor interação do depurador: exceções que você joga pela biblioteca padrão
nos locais afetados agora aparecem como sendo geradas de seu site de lançamento original, em vez de
nossa Rethrow. Nem todos os blocos de captura de biblioteca padrão foram eliminados. Esperamos que o
número de blocos catch seja reduzido em versões posteriores do MSVC.
A CodeGen subideal em std::bitset causado por uma jogada condicional dentro de uma noexcept
função foi corrigida por meio da fatoração do caminho de lançamento.
A família std::list e std::unordered_* usa iteradores de não depuração internamente em mais locais.
Vários membros std::list foram alterados para reutilizar os nós da lista onde possível, em vez de
desalocá-los e realocá-los. Por exemplo, considerando list<int> que já tenha um tamanho de 3, uma
chamada para assign(4, 1729) agora substitui os int valores nos três primeiros nós da lista e aloca um
novo nó de lista com o valor 1729.
Todas as chamadas da biblioteca padrão para erase(begin(), end()) foram alteradas para clear() .
Agora, std::vector inicializa e apaga os elementos com mais eficiência em determinados casos.
Melhorias em std::variant para torná-lo mais adequado para otimizadores, resultando na geração de
códigos melhores. O inlining de código agora está agora muito melhor com std::visit .
C++ IDE
Suporte de Live Share para C++
Agora, o Live Share dá suporte a C++, permitindo que desenvolvedores usem o Visual Studio ou o Visual Studio
Code para colaborar em tempo real. Para obter mais informações, consulte anunciando o Live share para C++:
Real-Time compartilhamento e colaboração
IntelliSense de modelo
A Barra de Modelo agora utiliza a interface do usuário de Janela de Inspeção em vez de uma janela modal,
dá suporte a modelos aninhados e pré-popula eventuais argumentos padrão na Janela de Inspeção . Para
obter mais informações, veja Melhorias de IntelliSense de modelo para Visual Studio 2019 versão prévia 2. Uma
lista suspensa Usados recentemente na Barra de Modelo permite alternar rapidamente entre conjuntos
anteriores de argumentos de exemplo.
Nova experiência de janela iniciar
Ao iniciar o IDE, uma nova janela inicial é exibida. Ele tem opções para abrir projetos recentes, clonar código do
controle do código-fonte, abrir código local como uma solução ou uma pasta ou criar um novo projeto. A caixa
de diálogo Novo Projeto também foi aprimorada para uma experiência de pesquisa que pode ser filtrada.
Novos nomes para alguns modelos de projeto
Modificamos vários nomes e descrições de modelo de projeto de acordo com a caixa de diálogo Novo Projeto
atualizada.
Diversos aprimoramentos de produtividade
O Visual Studio 2019 inclui os seguintes recursos que o ajudarão a tornar a codificação mais fácil e intuitiva:
Correções rápidas para:
Adicionar ausente #include
NULL em nullptr
Adicionar ponto e vírgula ausente
Resolver namespace ou escopo ausente
Substituir operandos de indireção inválidos ( * to & e & to * )
Informações rápidas para um bloco passando o mouse sobre a chave de fechamento
Espiar Cabeçalho / Arquivo de Código
Ir para definição em #include abre o arquivo
Para obter mais informações, veja Aprimoramentos de produtividade do C++ no Visual Studio 2019 Versão
Prévia 2.
Suporte para CMake
Suporte para CMake 3.14
O Visual Studio agora pode abrir caches do CMake existentes gerados por ferramentas externas, como o
CMakeGUI, ou por sistemas de metabuild personalizados ou scripts de build que invocam cmake.exe eles
mesmos.
Desempenho aprimorado de IntelliSense.
Um novo editor de configurações fornece uma alternativa para editar o arquivo CMakeSettings.json
manualmente e oferece alguma paridade com CMakeGUI.
O Visual Studio ajuda a impulsionar o desenvolvimento de C++ com o CMake no Linux, detectando se
você tem uma versão compatível do CMake em seu computador Linux. Caso contrário, ele oferece
instalá-lo para você.
As incompatibilidades de configuração no CMakeSettings, como arquiteturas incompatíveis ou
configurações incompatíveis do gerador de CMake, mostram linhas irregulares no editor JSON e erros na
Lista de Erros.
A cadeia de ferramentas do vcpkg é detectada automaticamente e habilitada para projetos do CMake que
são abertos no IDE após vcpkg integrate install ser executado. Esse comportamento pode ser
desativado especificando-se um arquivo de cadeia de ferramentas vazio no CMakeSettings.
Projetos do CMake agora permitem depuração Apenas Meu Código por padrão.
Os avisos de análise estática agora são processados em segundo plano e exibidos no editor para projetos
CMake.
Mensagens 'begin' e 'end' mais claras de build e de configuração para projetos do CMake e suporte à
interface do usuário de progresso do build do Visual Studio. Além disso, agora há uma configuração de
detalhes de CMake em Ferramentas > Opções para personalizar o nível de detalhe das mensagens de
build e configuração do CMake na Janela de Saída.
A configuração cmakeToolchain agora é compatível com o CMakeSettings.json para especificar cadeias
de ferramentas sem modificar manualmente a linha de comando do CMake.
Um novo atalho de menu Compilar Tudo****Ctrl + Shift + B .
Integração de IncrediBuild
O IncrediBuild foi incluído como um componente opcional na carga de trabalho Desenvolvimento para
desktop com C++ . O Monitor de Compilação do IncrediBuild foi totalmente integrado no IDE do Visual Studio.
Para obter mais informações, consulte Visualizar sua compilação com o monitor de compilação do IncrediBuild
e o Visual Studio 2019.
Depuração
Para aplicativos C++ em execução no Windows, os arquivos PDBs agora são carregados em um processo
separado de 64 bits. Essa alteração resolve uma variedade de falhas causadas pelo depurador com
memória insuficiente. Por exemplo, ao depurar aplicativos que contêm um grande número de módulos e
arquivos PDB.
A pesquisa está habilitada nas janelas Inspeção , Autos e Locais .
Desenvolvimento da Área de Trabalho do Windows com C++
Estes assistentes do C++ ATL/MFC não estão mais disponíveis:
Assistente de componente de COM+ 1.0 da ATL
Assistente do componente Active Server Page da ATL
Assistente de provedor OLE DB da ATL
Assistente de página de propriedades da ATL
Assistente de consumidor OLE DB da ATL
Consumidor ODBC do MFC
Classe MFC em Controle ActiveX
Classe MFC em TypeLib.
O código de exemplo para essas tecnologias está arquivado em Microsoft Docs e no repositório GitHub
VCSamples.
O SDK (Software Development Kit) do Windows 8.1 não está mais disponível no instalador do Visual
Studio. Recomendamos atualizar seus projetos em C++ para o SDK do Windows 10 mais recente. Se
você tiver uma dependência forte no 8.1, poderá baixá-la do arquivo do SDK do Windows.
O direcionamento do Windows XP não estará mais disponível para o conjunto de ferramentas do C++
mais recente. O direcionamento do XP com bibliotecas e o compilador MSVC no nível do VS 2017 ainda
é compatível e pode ser instalado por meio de "Componentes individuais".
Nossa documentação desencoraja ativamente o uso de módulos de mesclagem para a implantação do
Runtime do Visual C++. Estamos realizando, nesta versão, a etapa extra de marcar nossos MSMs como
preteridos. Considere migrar sua implantação central do VCRuntime de MSMs para o pacote
redistribuível.
Desenvolvimento móvel com C++ (Android e iOS )
A experiência do Android C++ agora usa por padrão o SDK do Android 25 e o NDK do Android 16b.
Conjunto de ferramentas de plataforma Clang/C2
O componente experimental Clang/C2 foi removido. Use o conjunto de ferramentas do MSVC para
conformidade total de padrões C++ com /permissive- e /std:c++17 ou a cadeia de ferramentas Clang/LLVM
para Windows.
Análise de código
A análise de código agora é executada automaticamente em segundo plano. Avisos são exibidos como
linhas irregulares verdes no editor conforme você digita. Para obter mais informações, consulte Análise
de código no editor no Visual Studio 2019 Versão Prévia 2.
Novas regras experimentais de ConcurrencyCheck para tipos de biblioteca padrão conhecidos do
<mutex> cabeçalho. Para obter mais informações, consulte Análise de código de simultaneidade no
Visual Studio 2019.
Uma implementação parcial atualizada do Verificador de perfil de tempo de vida, que detecta referências
e ponteiros pendentes. Para obter mais informações, consulte Atualização de perfil de tempo de vida no
Visual Studio 2019 Versão Prévia 2.
Mais verificações relacionadas a corrotinas, incluindo C26138, C26810, C26811e a regra experimental
C26800. Para obter mais informações, consulte Novas verificações de análise de código no Visual Studio
2019: uso após movimentação e corrotina.
Teste de unidade
O modelo de projeto de teste do C++ gerenciado não está mais disponível. Você pode continuar usando a
estrutura de teste do C++ gerenciado em seus projetos existentes. Para novos testes de unidade, considere usar
uma das estruturas de teste nativas para as quais o Visual Studio fornece modelos (MSTest, Google Test) ou o
modelo de projeto de teste de C# gerenciado.
Novidades do C++ no Visual Studio 2017
30/07/2021 • 33 minutes to read
O Visual Studio 2017 traz muitas atualizações e correções para o ambiente do C++. Corrigimos mais de 250
bugs e relataram problemas no compilador e nas ferramentas. Muitos foram enviados por clientes por meio do
relatório de um problema e fornecem uma sugestão de opções 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. 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 C++ docs: What ' s New.
O compilador dá suporte a cerca de 75% dos recursos que são novos no C++ 17, incluindo associações
estruturadas, constexpr lambdas, if constexpr variáveis embutidas, expressões de dobra e adição noexcept
ao sistema de tipos. Esses recursos estão disponíveis na /std:c++17 opção. para obter mais informações,
consulte melhorias de conformidade do C++ no Visual Studio 2017
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .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 anunciando: MSVC está em conformidade com a
compatibilidade de linguagem c++ Standard e Microsoft C/C++.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .8
/std:c++14 e /std:c++latest : essas opções de compilador permitem que você aceite versões
específicas da linguagem de programação ISO C++ em um projeto. A maioria dos novos recursos padrão
de rascunho é protegida pela /std:c++latest opção.
/std:c++17 habilita o conjunto de recursos C++ 17 implementados pelo compilador. Esta opção
desabilita o suporte do compilador e da biblioteca padrão para recursos após C++ 17: aqueles que são
alterados ou novos em versões posteriores do rascunho de trabalho e atualizações de defeito do padrão
C++. Para habilitar esses recursos, 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.
Segurança de código aprimorada: emissão aprimorada de diagnóstico de compilador de saturação de buffer
e /guard:cf agora protege instruções de switch que geram tabelas de salto.
Controle de versão: o valor da macro de pré-processador interna _ MSC _ Ver agora está sendo atualizado
de forma monotônico em cada atualização de conjunto de ferramentas 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 melhorias do diagnóstico do compilador do C++ em vs "15" Preview 5.
Ao usar corrotinas, a palavra-chave experimental yield (disponível na /await opção) foi removida. Em vez
disso, seu código deve ser atualizado para usar co_yield . Para obter mais informações, consulte yield
palavra-chave para se tornar co_yield em vs 2017.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Aprimoramentos adicionais para o diagnóstico no compilador. Para saber mais, confira Aperfeiçoamentos de
diagnóstico no Visual Studio 2017 15.3.0.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Visual C++ o desempenho do tempo de execução continua a melhorar por meio da melhor qualidade de código
gerada. 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 de compilador são melhorias na
funcionalidade existente, como a heurística vetorizador automático para expressões condicionais, otimizações
de loop melhores e CodeGen flutuante mín/máx. O vinculador tem uma implementação nova e mais rápida
/OPT:ICF , que pode resultar em até 9% de aumentos de tempo de vinculação, e há 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 comprimento de vetor
que trazem novas funções em AVX-512 a registros de largura de 128 bits e 256 bits.
A /Zc:noexceptTypes- opção 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.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Novo compilador switch /Qspectre para ajudar a mitigar contra ataques de canal lateral de execução
especulativa. Para obter mais informações, consulte mitigações Spectre em MSVC.
Novo aviso de diagnóstico da mitigação do Spectre. Para saber mais, confira Diagnóstico do Spectre no
Visual Studio 2017 versão 15.7 versão prévia 4.
Um novo valor para/ZC, /Zc:__cplusplus , permite a emissão de relatórios corretos do suporte standard do
C++. Por exemplo, quando a opção é definida e o compilador está no /std:c++17 modo, o valor expande
para 201703L . Para saber mais, confira Agora o MSVC relata corretamente __cplusplus.
há mais melhorias na biblioteca standard no Visual Studio 2017 RTM. Para obter uma lista completa, consulte a
entrada de blog da equipe do C++ correções de biblioteca padrão no VS 2017 RTM.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
std::partition agora chama os tempos de N predicado em vez N + 1 de vezes, como o padrão exige.
As tentativas de evitar estáticas mágicas na versão 15.3 foram reparadas 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 maneira diferente quando a depuração
do iterador está habilitada. Eles não fazem mais uma declaração de tempo linear de que a entrada é, na
verdade, 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 lida corretamente com a alocação de tipos sobrelinhados, ou seja,
tipos cujo alinhamento é maior que , a menos que desabilitado max_align_t 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() make_from_tuple() .
Adicionado <optional> , , e <variant> shared_ptr::weak_type <cstdalign> .
Habilitado C++14 constexpr min(initializer_list) em , e , e max(initializer_list) ,
minmax(initializer_list) e min_element() max_element() minmax_element() .
Vários recursos adicionais do C++17 foram implementados. Para obter mais informações, consulte Tabela de
conformidade da linguagem C++ da Microsoft.
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-. E
dynamic_pointer_cast() rethrow_if_nested() exigem inerentemente dynamic_cast , portanto, a biblioteca
padrão agora os marca como =delete em /GR- .
Mesmo quando o RTTI dinâmico foi desabilitado por meio de , "RTTI estático" na forma de ainda está
disponível e alimenta /GR- typeid(SomeType) vários componentes de biblioteca padrão. A biblioteca padrão
agora dá suporte à desabilitação desse recurso também, por meio de /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 C++14 constexpr 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 no agora usam o computador normal da biblioteca padrão, em vez da função
interna , que <random> _Rng_abort() chamou fputs() stderr . A implementação dessa função foi mantida
para compatibilidade binária. Vamos removê-lo na próxima versão incompatível binária da biblioteca padrão.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Vários recursos de biblioteca padrão foram adicionados, preterido ou removidos de acordo com o padrão
C++17. Para obter mais informações, consulte 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 são adicionadas, mas não paralelizadas no momento. A
criação de perfil não mostrou nenhum benefício na paralelização de algoritmos que apenas movem ou
permute elementos:
copy
copy_n
fill
fill_n
move
reverse
reverse_copy
rotate
rotate_copy
swap_ranges
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .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
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
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 for passado ponteiros em std::reverse para T facilmente copiado, ele agora enviará uma
implementação vetorizada manuscrita.
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, consulte vcpkg.
CPPRest SDK 2.9.0
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
A CPPRestSDK, uma API da Web de plataforma cruzada para o C++, foi atualizada para a versão 2.9.0. Para
obter mais informações, consulte CppRestSDK 2.9.0 está disponível no GitHub.
ATL
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
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 Adicionar Classe diretamente. Todos os outros itens que estavam
anteriormente aqui agora estão disponíveis em Adicionar > Novo Item .
Os projetos Win32 agora estão na categoria Windows Desktop na caixa de diálogo Project Novo.
Os modelos Windows Console e Aplicativo de Área de Trabalho agora criam os 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 .
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .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:
Renomear 5.3x
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 as operações de banco de dados, como Ir para Definição e Encontrar 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. (Ele estava
anteriormente em ... C/C++ > Experimental.)
Melhoramos o desempenho do IntelliSense em projetos e arquivos que não estão usando cabeçalhos
pré-compilados – um Cabeçalho Pré-Compilado Automático será criado para os 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 em erros específicos ou pressionar F1 iniciará uma
pesquisa online sobre a mensagem de erro.
Foi adicionado o suporte a ClangFormat. Para obter mais informações, veja Suporte a ClangFormat no Visual
Studio 2017.
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.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Suporte adicionado para CMake 3.11, análise de código em projetos CMake, exibição de destinos no
Gerenciador de Soluções, opções de geração de cache e compilação de arquivo único. Para obter mais
informações, confira Suporte a CMake no Visual Studio e Projetos CMake no Visual Studio.
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.
Foram feitas melhorias na visualização de tipo e no compartilhamento de código multiplataforma. Para saber
mais, veja Aprimoramentos do C++ para Linux para compartilhamento de código entre plataformas e
visualização de tipo.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
A carga de trabalho do Linux adicionou suporte para rsync como uma 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.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Várias melhorias para cenários de carga de trabalho do Linux. Para obter mais informações, veja Melhorias
na carga de trabalho do Linux C++ para o Sistema de Projeto, para a Janela de Console do Linux, para rsync
e para Anexar ao Processo.
IntelliSense para cabeçalhos em conexões remotas do Linux. Para obter mais informações, veja IntelliSense
para cabeçalhos remotos do Linux e Configurar um projeto CMake do Linux.
Novas Diretrizes Principais do C++ verificações abrangem a correção do ponteiro inteligente, o uso
correto de inicializadores globais e a sinalização de usos de constructos como goto e de casts ruins.
Alguns números de aviso que podem ser encontrados na 15.3 não estão mais disponíveis no 15.5. Esses
avisos foram substituídos por verificações mais específicas.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6
Suporte adicionado para análise de arquivo único e melhorias no desempenho de tempo de execução de
análise. Para obter mais informações, veja Melhorias de análise estática do C++ para Visual Studio 2017 15.6
versão prévia 2
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Suporte adicionado para /analyze:ruleset , que permite especificar as regras de análise de código a
executar.
Suporte adicionado para regras de Diretrizes Principais do C++ adicionais. Para saber mais, veja Uso dos
verificadores de diretrizes de núcleo do C++.
Google Test Adaptador e Adaptador Boost.Test agora estão disponíveis como componentes da carga de trabalho
Desenvolvimento para Área de Trabalho com C++. Eles são integrados ao Test Explorer. O suporte a CTest é
adicionado para projetos do CMake (usando Abrir Pasta), embora a integração completa com o Explorador de
Testes ainda não está disponível. Para obter mais informações, consulte Escrevendo testes de unidade para
C/C++.
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6
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++.
Pesquisa e filtro na tabela de objetos: fornece uma maneira rápida e fácil de localizar os recursos
que você está procurando.
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.
Ele exibe a nova janela da ferramenta Histórico de Recursos, preenchida com o histórico de alterações
do recurso.
Você pode capturar quadros com a captura de pilha de chamada completa habilitada. Isso permite
deduzir rapidamente o contexto de cada evento de alteração e inspecioná-lo em seu Visual Studio
projeto. De definir a opção de captura de pilha completa na caixa Visual Studio ferramentas > opções
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ê pode não perceber que está fazendo ou chamadas que está fazendo com muita
frequência. Essa janela está disponível por meio de Exibir > estatísticas de API no Visual Studio
Graphics Analyzer.
Estatísticas de memória: Exibir a memória alocada pelo driver para os recursos que você cria no
quadro. Essa janela está disponível por meio de Exibir > estatísticas de memória no Visual Studio
Graphics Analyzer . 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.
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 Visual Studio Graphics Analyzer 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.
Análise de quadro para D3D12: Use a Análise de Quadro para analisar o desempenho de chamada de
desenho com experimentos direcionados de "what-if". Mudar para a guia de Análise de Quadros e
executar uma análise para exibir o relatório. Para obter mais detalhes, assista ao vídeo GoingNative 25:
Análise de Quadros de Gráficos do Visual Studio.
Melhorias de uso de GPU: Os rastreamentos abertos podem ser feitos por meio do Visual Studio de
uso de GPU com a Exibição de GPU ou a ferramenta WPA (Windows Performance Analyzer) para análise
mais detalhada. Se você tiver o Windows performance Toolkit instalado, haverá dois hiperlinks: um para
WPA e outro para Exibição de GPU, na parte inferior direita da visão geral da sessão.
Os rastreamentos abertos na Exibição de GPU por meio deste link são suportados pelo zoom e pelo
panorâmico sincronizado do VS e da Exibição de GPU. Uma caixa de seleção no VS controla se a
sincronização está habilitada ou não.
Microsoft C++ docs: novidades para junho de 2021
16/07/2021 • 16 minutes to read
Este artigo lista as principais alterações nos documentos do Microsoft C++ até junho de 2021.
Consulte o histórico de novidades para obter informações sobre as novidades nos meses anteriores.
veja o que há de novo para o C++ no Visual Studio para obter informações sobre as novidades do Visual
Studio.
consulte melhorias de conformidade do c++ em Visual Studio para obter o status de conformidade C e C++
mais recente.
Insights de build
Novos ar tigos
Classe HeaderUnit
Classe de módulo
Classe PrecompiledHeader
TRANSLATION_UNIT_TYPE enum
TRANSLATION_UNIT_TYPE_DATA enum
Classe TranslationUnitType
Ar tigos atualizados
SDK do build Insights do c++: tabela de eventos – adicionar novos eventos de compilação do C++ Insights
introdução ao c++ build Insights -adicionar novos eventos de compilação do c++ Insights
Linguagem C
Ar tigos atualizados
_Static_assert palavra-chave e static_assert macro (C11) – atualizar o SDK para usar
Alinhamento (C11) – atualize o SDK para usar
Seleção genérica (C11) – atualizar o SDK para usar
Biblioteca de runtime C
Ar tigos atualizados
Além das alterações abaixo, muitos artigos foram atualizados para evitar a tradução automática de elementos
de código.
_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l - printf() alteração de comportamento de
arredondamento
_cprintf_s, _cprintf_s_l, _cwprintf_s, _cwprintf_s_l - printf() alteração de comportamento de
arredondamento
_cprintf, _cprintf_l, _cwprintf, _cwprintf_l - printf()alteração de comportamento de arredondamento
_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l - printf() alteração de comportamento de
arredondamento
_get_printf_count_output - printf() alteração de comportamento de arredondamento
_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l - printf() alteração de comportamento de
arredondamento
_scprintf_p, _scprintf_p_l, _scwprintf_p, _scwprintf_p_l - printf() alteração de comportamento de
arredondamento
_scprintf, _scprintf_l, _scwprintf, _scwprintf_l - printf() alteração de comportamento de
arredondamento
_vcprintf_p, _vcprintf_p_l, _vcwprintf_p, _vcwprintf_p_l - printf() alteração de comportamento de
arredondamento
_vcprintf_s, _vcprintf_s_l, _vcwprintf_s, _vcwprintf_s_l - printf() alteração de comportamento de
arredondamento
_vscprintf, _vscprintf_l, _vscwprintf, _vscwprintf_l - printf() alteração de comportamento de
arredondamento
_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l - printf() alteração de comportamento de
arredondamento
_snprintf_s , _snprintf_s_l , _snwprintf_s , _snwprintf_s_l - printf() alteração de comportamento de
arredondamento
errno constantes -melhorar a legibilidade
fprintf , _fprintf_l , fwprintf , _fwprintf_l - printf() alteração de comportamento de
arredondamento
freopen_s , _wfreopen_s -novos sinalizadores de C11
freopen , _wfreopen -sinalizadores de C11 adicionados
,-observação alterar para a partir do vs 2015 atualização 1 pow powf powl pow(T,int)
printf_s , _printf_s_l , wprintf_s , _wprintf_s_l - printf() alteração de comportamento de
arredondamento
setlocale , _wsetlocale -modo de cadeia de caracteres UTF-8 esclarecido
sprintf , _sprintf_l , swprintf , _swprintf_l , __swprintf_l alteração de comportamento de - printf()
arredondamento
cprintf - printf() alteração de comportamento de arredondamento
fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l - printf() alteração de comportamento de
arredondamento
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l - printf() alteração de comportamento de
arredondamento
strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l -exemplos de código fixo
strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l - printf() alteração de
comportamento de arredondamento
Tipo-matemática genérica -atualização da versão do SDK a ser usada
vprintf, _vprintf_l, vwprintf, _vwprintf_l - printf() alteração de comportamento de arredondamento
vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l - printf() alteração de comportamento de
arredondamento
Ar tigos atualizados
bitset classe -melhor legibilidade
digitação de ortografia de vector classe no código de exemplo
Qualidade do código
Novos ar tigos
C6389: MARK_INTERNAL_OR_MISSING_COMMON_DECL
Ar tigos atualizados
C6031 -adicionar observação sobre ignorar o valor de retorno de uma função
C26432 DEFINE_OR_DELETE_SPECIAL_OPS -exemplos de código de atualização
C26497 USE_CONSTEXPR_FOR_FUNCTION -adicionar observação sobre quando o aviso não será emitido
Colaboradores da Comunidade
As pessoas a seguir contribuíram para os documentos C++, C e Assembler durante esse período. Obrigado!
Consulte visão geral do guia do colaborador do Microsoft docs se você gostaria de aprender como contribuir.
0xbadfca11 (1)
bclehmann -Benjamin Lehmann (1)
Brian-Taylor8 (1)
cartwrightluke (2)
ccawley2011 -Cameron Cawley (1)
EddieBreeveld -Edward Breeveld (1)
FrankAtHexagon -Frank Edwards (1)
fsb4000 -Igor Zhukov (1)
Jaiganeshkumaran -Jaiganesh Kumaran (2)
jayvient -Jayvien (1)
KishkinJ10 (1)
kokosxD -Kokos (1)
langemol -Jacco mol (1)
MUzairS15 (1)
nadavsu -Nadav (1)
NegiAkash890 -Akash Negi (1)
pjessesco -Jino Park (1)
pramodkirchki (1)
Radfordhound -Graham Scott (1)
sapant-MSFT (1)
sebgod -Sebastián Godelet (1)
seedkar1 (1)
ShamanCoder (1)
Sheila-Stewart (1)
softmac (1)
Thieum -Matthieu penant (2)
tjs137 (1)
urmyfaith -ZX (1)
ValZapod -Valerii Zapodovnikov (1)
westinn -Nicolas Westin (1)
Histórico de novidades
a seção a seguir fornece os meses anteriores de novidades no Visual Studio docs.
Fevereiro de 2021
Linguagem C
Novos ar tigos
_Noreturn palavra-chave e noreturn macro (C11)
_Static_assert palavra-chave e static_assert macro (C11)
Ar tigos atualizados
Operadores de atribuição C -atualização de gramática lexical para C17
Declarações de enumeração C – gramática léxica fixa
Palavras-chave C -atualização de gramática lexical para C17
C gramática lexical -atualização lexical de gramática para C17
Analisando argumentos c Command-Line -exceções de documento para as regras de análise de argumentos
c
Resumo de instruções C – atualizado para __leave , __try palavras-chave
Resumo de declarações -atualização lexical de gramática para C17
Resumo de expressões -atualização de gramática lexical para C17
Qualificadores de tipo -adicionados restrict
Biblioteca de runtime C
Novos ar tigos
Matemática do tipo genérico
Ar tigos atualizados
_cwait -exemplo de código fixo
assert Macro, _assert, _wassert -Comportamento de declaração de esclarecimento
qsort -foi adicionada uma observação sobre a estabilidade
realloc -notas de conformidade do C99 adicionadas
round, roundf, roundl -Exemplo de código de arredondamento esclarecido
setlocale, _wsetlocale -informações de suporte do C Runtime UTF-8 adicionadas
vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, _vsnwprintf_s_l -Valores de retorno esclarecidos
Compatibilidade -notas de conformidade do C99 adicionadas
Recursos da biblioteca CRT -C99 de notas de conformidade adicionadas
Visão geral da família de funções – operador adicionado new e delete
Referência de pré-processador C/C++
Ar tigos atualizados
visão geral do novo pré-processador de MSVC -conteúdo do pré-processador atualizado
macros predefinidas – atualizadas para Visual Studio notas de versão 16,8, suporte a C11/C17 /std e
documentos de instalação do SDK
Qualidade do código
Novos ar tigos
C33001 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
C33004 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
C33005 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
C33010 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
C33011 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
C33020 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
C33022 -VC Code Analysis-adicionar para novas regras no Visual Studio 16,8
Ar tigos atualizados
C6262 -address cpp-docs. zh-Taiwan problema 20
C26401 DONT_DELETE_NON_OWNER -foram adicionados um link de exemplo e diretrizes principais para C26401
C26402DONT_HEAP_ALLOCATE_MOVABLE_RESULT -exemplo adicionado para C26402
C26408 NO_MALLOC_FREE -foram adicionados um link de exemplo e diretrizes principais para C26408
C26409 NO_NEW_DELETE -exemplo adicionado para C26409
C26432 DEFINE_OR_DELETE_SPECIAL_OPS -exemplo adicionado para C26432
C26434 DONT_HIDE_METHODS -exemplo adicionado para C26434
C26436 NEED_VIRTUAL_DTOR -foram adicionados um link de exemplo e diretrizes principais para C26436
C26439 SPECIAL_NOEXCEPT -adição de exemplo e link para as diretrizes principais para C26439
C26440 DECLARE_NOEXCEPT -adição de exemplo e link para as diretrizes principais para C26440
C26446 USE_GSL_AT -foi adicionado um exemplo para C26446
C26447 DONT_THROW_IN_NOEXCEPT -adicionando exemplo a C26447
C26460 USE_CONST_REFERENCE_ARGUMENTS -adição de descrição e exemplo para C26460
C26461 USE_CONST_POINTER_ARGUMENTS: -adição de descrição e exemplo para C26461
C26462 USE_CONST_POINTER_FOR_VARIABLE -adição de descrição e exemplo para C26462
C26465 NO_CONST_CAST_UNNECESSARY -adicionado o exemplo a C26465
C26466 NO_STATIC_DOWNCAST_POLYMORPHIC -adicionado o exemplo a C26466
C26471 NO_REINTERPRET_CAST_FROM_VOID_PTR -adicionado o exemplo a C26471
C26474 NO_IMPLICIT_CAST -atualizado para esclarecer casos de base/derivados
C26482 NO_DYNAMIC_ARRAY_INDEXING -adicionado o exemplo a C26482
C26483 STATIC_INDEX_OUT_OF_RANGE -adicionado o exemplo a C26483
C26490 NO_REINTERPRET_CAST -adicionado o exemplo a C26490
C26492 NO_CONST_CAST -adicionado o exemplo a C26492
C26493 NO_CSTYLE_CAST -adicionado o exemplo a C26493
C26494 VAR_USE_BEFORE_INIT – exemplo adicionado a C26494
C26495 MEMBER_UNINIT – exemplos e links atualizados no C26495
C26496 USE_CONST_FOR_VARIABLE – exemplo adicionado a C26496
C26497 USE_CONSTEXPR_FOR_FUNCTION – exemplo adicionado a C26497
Ar tigos atualizados
/clr (Compilação do Common Language Runtime) – adicionada descrição para /clr
/permissive- (Conformidade com padrões) – atualizado para Visual Studio notas de versão 16.8
Importando dados __declspec(dllimport) usando – exemplo atualizado
pgosweep – adicionadas mais opções pgosweep
Guia de porta e atualização do C++
Ar tigos atualizados
Como usar código C++ existente em um aplicativo da Plataforma universal Windows – retrabalho para
maior clareza e exemplos atualizados
Referência da STL (Biblioteca Padrão) do C++
Novos ar tigos
<bit>
<bit> Funções
endian Enum
Ar tigos atualizados
<bit> functions – sintaxe nodiscard atualizada
<ios> typedefs – exemplo atualizado
basic_string_view Classe – starts_with() adicionada, ends_with()
basic_string Classe – _starts_with() adicionada, ends_with()
ios_base Class
map classe
multimap Classe – adicionada contains()
multiset Classe – adicionada contains()
set Classe – adicionada contains()
unordered_map Classe – adicionada contains()
unordered_multimap Classe – adicionada contains()
unordered_multiset Classe – adicionada contains()
unordered_set Classe – adicionada contains()
Colaboradores da Comunidade
As pessoas a seguir contribuíram para os documentos C++, C e Assembler durante esse período. Obrigado!
Confira Microsoft Docs visão geral do guia do colaborador se você quiser saber como contribuir.
EdFish - Da ltda B. (1)
codevenkat (1)
definedrisk – Ben (3)
eltociear – Ikko Ashimine (1)
fsb4000 – Igor Korkov (1)
Jaesheshkumaran – Jaeshesh Ltdan (1)
jogo- (1)
justanotheranonymoususer (1)
matrohin - Dmitry Matrokhin (1)
mhemmit (1)
MSDN-WhiteK operação – MSDN. WhiteK ltda (1)
FranciscoTemple – Temple DeIa (1)
r00tdr4g0n – r00tdr4g0n (1)
sebkraemer – Krümer (1)
vtjnash – Jameson Ltda (1)
yecril71pl – Ye yenecton
Youssef1313 – Youssef Paulo (1)
zecozephyr – Allan Ltda (1)
Melhorias de conformidade do C++, alterações de
comportamento e correções de bugs Visual Studio
2019
03/07/2021 • 73 minutes to read
O Microsoft C/C++ no Visual Studio (MSVC) faz melhorias de conformidade e correções de bugs em cada
versão. Este artigo lista as melhorias por versão principal e depois pela versão. Para ir diretamente para as
alterações de uma versão específica, use a lista abaixo neste ar tigo .
Este documento lista as alterações no Visual Studio 2019. Para ver um guia sobre as alterações no Visual Studio
2017, confira Melhorias de conformidade do C++ no Visual Studio 2017. Para ver uma lista completa das
melhorias de conformidade anteriores, Visual C++ Novidades de 2003 a 2015.
NOTE
Os recursos do C++20 estão disponíveis no modo até que a implementação do C++20 seja concluída para o
/std:c++latest compilador e o IntelliSense. Nesse momento, apresentaremos o modo /std:c++20 do compilador.
struct B
{
B() = default; // user-declared ctor
int i = 0;
};
P0515R3 O C++20 apresenta o operador de comparação de três vias <=> , também conhecido como o
"operador espaçonave". Visual Studio 2019 no modo introduz suporte parcial para o operador, ingando erros de
sintaxe que agora não /std:c++latest é permitido. Por exemplo, o código a seguir é compilado sem erros no
Visual Studio 2017, mas gera vários erros no Visual Studio 2019 em /std:c++latest :
struct S
{
bool operator<=(const S&) const { return true; }
};
Para evitar os erros, insira um espaço na linha incorreta antes do colchete angular final: U<&S::operator<= > u; .
Referências a tipos sem qualificadores CV incompatíveis
Anteriormente, o MSVC permitia associação direta de uma referência a partir de um tipo com qualificadores CV
incompatíveis abaixo do nível superior. Essa associação poderia permitir a modificação de dados const
supostamente mencionados pela referência. Agora, o compilador cria um temporário, conforme exigido pelo
padrão. No Visual Studio 2017, o código a seguir é compilado sem avisos. No Visual Studio 2019, o compilador
gera o aviso C4172:
struct X
{
const void* const& PData() const
{
return _pv;
}
void* _pv;
};
int main()
{
X x;
auto p = x.PData(); // C4172 <func:#1 "?PData@X@@QBEABQBXXZ"> returning address of local variable or
temporary
}
reinterpret_cast de uma função sobrecarregada
O argumento para não é um dos contextos em que o endereço de uma função sobrecarregada
reinterpret_cast é permitido. O código a seguir é compilado sem erros no Visual Studio 2017, mas, no Visual
Studio 2019, ele gera o erro C2440:
int main()
{
fp r = reinterpret_cast<fp>(&f); // C2440: cannot convert from 'overloaded-function' to 'fp'
}
Para evitar o erro, use uma conversão permitida para esse cenário:
int f(int);
int f(float);
using fp = int(*)(int);
int main()
{
fp r = static_cast<fp>(&f); // or just &f;
}
Fechamentos lambda
No C++ 14, os tipos de fechamento lambda não são literais. A principal consequência dessa regra é que um
lambda não pode ser atribuído a uma constexpr variável. O código a seguir é compilado sem erros no Visual
Studio 2017, mas no Visual Studio 2019 ele gera o erro C2127:
int main()
{
constexpr auto l = [] {}; // C2127 'l': illegal initialization of 'constexpr' entity with a non-constant
expression
}
Para evitar o erro, remova o constexpr qualificador ou altere o modo de conformidade para /std:c++17 .
Códigos de falha de std::create_directory
Por LWG 2221, adicionado operator<<(std::ostream, nullptr_t) para a escrita em nullptr fluxos.
Mais algoritmos paralelos
Novas versões paralelas de is_sorted , is_sorted_until , is_partitioned , set_difference , set_intersection ,
is_heap e is_heap_until .
inicialização atômica
P0883 "Corrigindo a inicialização atômica" muda para inicializar o contido em vez de std::atomic T inicializá-
lo por padrão. A correção é habilitada ao usar o Clang/LLVM com a biblioteca padrão da Microsoft. Atualmente,
ele está desabilitado para o compilador do Microsoft C++, como uma solução alternativa para um bug
constexpr no processamento.
remove_cvref e remove_cvref_t
long long i = 0;
constexpr void f() {
int* a = reinterpret_cast<int*>(i); // C3615: constexpr function 'f' cannot result in a constant
expression
}
std::wstring ws = /* . . . */;
std::string out(ws.begin(), ws.end()); // VS2019 C4244: 'argument': conversion from 'wchar_t' to 'const
_Elem', possible loss of data.
Visual Studio 2019 gera corretamente o aviso C4244. Para evitar o aviso, você pode inicializar std::string o
conforme mostrado neste exemplo:
Para evitar o erro neste exemplo, use o += operador com o método : ToString() s += E::e.ToString(); .
Inicializadores de membros de dados estáticos embutidos
Os acessos de membro inline inválidos dentro static constexpr dos inicializadores e agora são detectados
corretamente. O exemplo a seguir compila sem erro no Visual Studio 2017, mas no Visual Studio 2019 no modo
, ele gera o erro /std:c++17 C2248:
struct X
{
private:
static inline const int c = 1000;
};
struct Y : X
{
static inline int d = c; // VS2019 C2248: cannot access private member declared in class 'X'.
};
struct X
{
protected:
static inline const int c = 1000;
};
C4800 restabelecido
MSVC costumava ter um aviso de desempenho C4800 sobre conversão implícita em bool . Ele era muito
barulhento e não pôde ser suprimido, levando-nos a removê-lo Visual Studio 2017. No entanto, durante o ciclo
de vida do Visual Studio 2017, recebemos muitos comentários sobre os casos úteis que ele estava resolvendo.
No Visual Studio 2019, estamos retornando um C4800 cuidadosamente ajustado com o C4165 explicativo.
Ambos os avisos são fáceis de suprimir: usando uma cast explícita ou por comparação com 0 do tipo
apropriado. C4800 é um aviso de nível 4 off-by-default e C4165 é um aviso de nível 3 off-by-default. Ambos
podem ser descobertos usando a opção /Wall do compilador .
O exemplo a seguir gera C4800 e C4165 em /Wall :
bool test(IUnknown* p)
{
bool valid = p; // warning C4800: Implicit conversion from 'IUnknown*' to bool. Possible information
loss
IDispatch* d = nullptr;
HRESULT hr = p->QueryInterface(__uuidof(IDispatch), reinterpret_cast<void**>(&d));
return hr; // warning C4165: 'HRESULT' is being converted to 'bool'; are you sure this is what you want?
}
Para evitar os avisos no exemplo anterior, é possível escrever o código da seguinte maneira:
bool test(IUnknown* p)
{
bool valid = p != nullptr; // OK
IDispatch* d = nullptr;
HRESULT hr = p->QueryInterface(__uuidof(IDispatch), reinterpret_cast<void**>(&d));
return SUCCEEDED(hr); // OK
}
void example()
{
struct A
{
int boo(); // warning C4822: Local class member function doesn't have a body
};
}
// C7510.cpp
// compile using: cl /EHsc /W4 /permissive /std:c++latest C7510.cpp
#include <iostream>
if constexpr (a.val)
{
return 1;
}
else
{
return 2;
}
}
struct X
{
using Type = X;
constexpr static int val = 1;
};
int main()
{
std::cout << f<X>() << "\n";
}
Para evitar o erro, adicione a typename palavra-chave à declaração de a : typename T::Type a; .
Não há suporte ao código do assembly embutido em uma expressão lambda
A equipe do Microsoft C++ foi recentemente consciente de um problema de segurança no qual o uso de
Assembler embutido em um lambda poderia causar a corrupção de ebp (o registro do endereço de retorno)
em tempo de execução. Um invasor mal-intencionado possivelmente poderia tirar proveito desse cenário. O
Assembler embutido só tem suporte no x86, e a interação entre o Assembler embutido e o restante do
compilador é ruim. Considerando esses fatos e a natureza do problema, a solução mais segura para esse
problema foi não permitir o Assembler embutido dentro de uma expressão lambda.
O único uso do assembler embutido em uma expressão lambda que encontramos “em condições naturais” era
capturar o endereço de retorno. Nesse cenário, é possível capturar o endereço de retorno em todas as
plataformas usando simplesmente um _ReturnAddress() intrínseco do compilador.
o código a seguir produz C7552 no Visual Studio 2017 15,9 e no Visual Studio 2019:
#include <cstdio>
int f()
{
int y = 1724;
int x = 0xdeadbeef;
mov eax, x
mov y, eax
}
};
lambda();
return y;
}
Para evitar o erro, mova o código do assembly para uma função nomeada conforme mostrado no exemplo a
seguir:
#include <cstdio>
int f()
{
int y = 1724;
int x = 0xdeadbeef;
auto lambda = [&]
{
g(x, y);
};
lambda();
return y;
}
int main()
{
std::printf("%d\n", f());
}
Algumas condições que poderiam fazer std::linear_congruential_engine disparar a divisão por 0 foram
corrigidas.
Correções para desencapsulamento do iterador
algumas máquinas de iterador-desencapsulamento foram expostas primeiro para a integração de usuário do
programador no Visual Studio 2017 15,8. Ele foi descrito no artigo do blog da equipe do C++ recursos STL e
correções no VS 2017 15,8. Essa maquina não desenvolve mais os iteradores derivados dos iteradores de
biblioteca padrão. Por exemplo, um usuário derivado de std::vector<int>::iterator e que tenta personalizar o
comportamento agora obtém seu comportamento personalizado ao chamar algoritmos de biblioteca padrão,
em vez do comportamento de um ponteiro.
Agora, a função reserve de contêiner não ordenada na verdade reserva N elementos, conforme descrito em
LWG 2156.
Manipulação de tempo
Anteriormente, alguns valores temporais que eram passados para a biblioteca de simultaneidade
estourariam, por exemplo, condition_variable::wait_for(seconds::max()) . Agora corrigidos, os estouros
mudaram o comportamento em um ciclo aparentemente aleatório de 29 dias (quando uint32_t
milissegundos aceitos pelas APIs do Win32 subjacentes estouravam).
O <ctime> cabeçalho agora declara timespec e timespec_get no namespace corretamente std e
também os declara no namespace global.
Várias correções de contêineres
Muitas funções de contêiner interno de biblioteca padrão foram feitas private para uma experiência
aprimorada do IntelliSense. Mais correções para marcar Membros como private são esperadas em
versões posteriores do MSVC.
Corrigimos problemas de correção de segurança de exceção que faziam com que contêineres baseados
em nó, como list , map e unordered_map , se tornem corrompidos. Durante uma
propagate_on_container_copy_assignment propagate_on_container_move_assignment operação ou
reatribuição, liberamos o nó Sentinel do contêiner com o alocador antigo, fazemos a atribuição de
POCCA/POCMA sobre o alocador antigo e, em seguida, tentamos adquirir o nó Sentinel do novo
alocador. Se essa alocação falhou, o contêiner estava corrompido. Ele não poderia até ser destruído, pois
a propriedade de um nó Sentinela é uma invariável de estrutura de dados rígido. Esse código foi
corrigido para criar o novo nó Sentinel usando o alocador do contêiner de origem antes de destruir o nó
sentinela existente.
Os contêineres foram corrigidos para alocadores sempre copiar/mover/trocar de acordo com
propagate_on_container_copy_assignment , propagate_on_container_move_assignment e
propagate_on_container_swap , mesmo para alocadores declarados is_always_equal .
Foram adicionadas sobrecargas para mesclagem de contêiner e extração de funções de membro que
aceitam contêineres rvalue. para obter mais informações, consulte P0083 "da união Mapas And Sets"
std::basic_istream::read processamento de \r\n`` => \n'
std::basic_istream::read foi corrigido para não gravar em partes do buffer fornecido temporariamente como
parte do \r\n \n processamento. Essa alteração perde um pouco da vantagem de desempenho que foi obtida
no Visual Studio 2017 15.8 para leituras com mais de 4 K. No entanto, as melhorias na eficiência evitando três
chamadas virtuais por caractere ainda estão presentes.
Construtor std::bitset
O construtor std::bitset não lê mais os numerais um e zero em ordem inversa em conjuntos de bits grandes.
Regressão de std::pair::operator=
Correção de uma regressão no std::pair operador de atribuição introduzida ao implementar LWG 2729
"SFINAE ausente em std::pair::operator= ";. Ele agora aceita corretamente tipos conversíveis em std::pair
novamente.
Contextos não deduzidos para add_const_t
Correção de um bug de características de tipo secundário, em que add_const_t e funções relacionadas devem
ser um contexto não deduzido. Em outras palavras, add_const_t deve ser um alias para
typename add_const<T>::type , e não const T .
#include <type_traits>
using T = std::identity<int>::type;
T x, y = std::identity<T>{}(x);
int i = 42;
long j = std::identity<long>{}(i);
O exemplo a seguir mostra como usar o novo std::identity (definido em <functional> ) junto com o novo
std::type_identity :
#include <type_traits>
#include <functional>
using T = std::type_identity<int>::type;
T x, y = std::identity{}(x);
int i = 42;
long j = static_cast<long>(i);
no Visual Studio 2017, esse código é compilado sem avisos, mas em Visual Studio 2019 ele produz o erro
C2760:
void f() {
auto a = [](auto arg) {
decltype(arg)::Type t; // C2760 syntax error: unexpected token 'identifier', expected ';'
};
}
void f() {
auto a = [](auto arg) {
typename decltype(arg)::Type t;
};
}
Inicialização designada
A inicialização designada do P0329R4 (c++ 20) permite que membros específicos sejam selecionados na
inicialização agregada usando a Type t { .member = expr } sintaxe. Requer /std:c++latest .
Funções da biblioteca padrão novas e atualizadas (C++20)
starts_with() e ends_with() para basic_string e basic_string_view .
contains() para contêineres associativos.
remove() , remove_if() , e unique() para list e forward_list agora retornam size_type .
shift_left() e shift_right() adicionados a <algorithm>.
int main() {
static_assert(noexcept(f()), "f should be noexcept"); // C2338 in 16.2
}
int main() {
static_assert(noexcept(f()), "f should be noexcept");
}
enum E1 { a };
enum E2 { b };
int main() {
int i = a | b; // warning C5054: operator '|': deprecated between enumerations of different types
}
enum E1 { a };
enum E2 { b };
int main() {
int i = a | static_cast<int>(b);
}
Usar uma operação binária entre uma enumeração e um tipo de ponto flutuante agora é um aviso quando a
/std:c++latest opção do compilador está habilitada:
enum E1 { a };
int main() {
double i = a * 1.1;
}
enum E1 { a };
int main() {
double i = static_cast<int>(a) * 1.1;
}
int main() {
int a[] = { 1, 2, 3 };
int b[] = { 1, 2, 3 };
if (a == b) { return 1; } // warning C5056: operator '==': deprecated for array types
}
Para evitar o aviso, você pode comparar os endereços dos primeiros elementos:
int main() {
int a[] = { 1, 2, 3 };
int b[] = { 1, 2, 3 };
if (&a[0] == &b[0]) { return 1; }
}
Uma definição do operador Spaceship ( <=> ) sozinha não irá mais reescrever expressões que envolvam == ou
a != menos que o operador de espaço esteja marcado como = default (P1185R2). o exemplo a seguir é
compilado no Visual Studio 2019 RTW e na versão 16,1, mas produz C2678 no Visual Studio 2019 versão 16,2:
#include <compare>
struct S {
int a;
auto operator<=>(const S& rhs) const {
return a <=> rhs.a;
}
};
bool eq(const S& lhs, const S& rhs) {
return lhs == rhs; // error C2676
}
bool neq(const S& lhs, const S& rhs) {
return lhs != rhs; // error C2676
}
#include <compare>
struct S {
int a;
auto operator<=>(const S& rhs) const {
return a <=> rhs.a;
}
bool operator==(const S&) const = default;
};
bool eq(const S& lhs, const S& rhs) {
return lhs == rhs;
}
bool neq(const S& lhs, const S& rhs) {
return lhs != rhs;
}
struct K
{
int a;
string b = "label";
};
struct Comparer {
bool operator() (K a, K b) {
return a.a < b.a;
}
};
K const s1{1};
K const s2{2};
K const s3{3};
int main() {
m.emplace(s1, 1.08);
m.emplace(s2, 3.14);
m.emplace(s3, 5.21);
struct Comparer {
bool operator() (K a, K b) const {
return a.a < b.a;
}
};
// stream_extraction.cpp
// compile by using: cl /std:c++latest stream_extraction.cpp
#include <iostream>
#include <iomanip>
int main() {
char x[42];
char* p = x;
std::cin >> std::setw(42);
std::cin >> p; // C2679: binary '>>': no operator found which takes a right-hand operand of type 'char
*' (or there is no acceptable conversion)
}
Para evitar o erro, use o operador de extração com uma char[] variável:
#include <iostream>
#include <iomanip>
int main() {
char x[42];
std::cin >> std::setw(42);
std::cin >> x; // OK
}
Novas palavras-chave requires e foram concept adicionadas ao compilador do Microsoft C++. Se você tentar
usar uma como um identificador no /std:c++latest modo, o compilador irá gerar C2059: "erro de sintaxe".
Construtores como nomes de tipo não permitidos
O compilador não considera mais os nomes de construtor como nomes de classe injetados nesse caso: quando
eles aparecem em um nome qualificado após um alias para uma especialização de modelo de classe.
Anteriormente, os construtores eram utilizáveis como um nome de tipo para declarar outras entidades. O
exemplo a seguir agora produz C3646:
#include <chrono>
class Foo {
std::chrono::milliseconds::duration TotalDuration{}; // C3646: 'TotalDuration': unknown override
specifier
};
#include <chrono>
class Foo {
std::chrono::milliseconds TotalDuration {};
};
namespace N
{
extern "C" void f(int, int, int, bool);
}
void g()
{
N::f(0, 1, 2, false);
}
Para evitar os erros no exemplo anterior, use bool em vez de BOOL consistentemente em ambas as declarações
do f .
Aprimoramentos da biblioteca padrão
Os cabeçalhos não padrão <stdexcpt.h> e foram <typeinfo.h> removidos. O código que os inclui deve incluir os
cabeçalhos padrão <exception> e <typeinfo> , respectivamente.
A pesquisa de nome em duas fases requer que os nomes não dependentes usados nos corpos do modelo
fiquem visíveis para o modelo no tempo de definição. Anteriormente, esses nomes podem ter sido encontrados
quando o modelo é instanciado. essa alteração torna mais fácil escrever código portátil e de conformidade em
MSVC sob o /permissive- sinalizador.
no Visual Studio 2019 versão 16,4 com o /permissive- sinalizador definido, o exemplo a seguir produz um
erro, porque N::f não está visível quando o f<T> modelo é definido:
namespace N {
int f() { return 42; }
}
Normalmente, esse erro pode ser corrigido incluindo cabeçalhos ausentes ou funções ou variáveis declaradoras
de encaminhamento, conforme mostrado no exemplo a seguir:
namespace N {
int f();
}
namespace N {
int f() { return 42; }
}
Conversão implícita de expressões de constante integral para ponteiro nulo
o compilador de MSVC agora implementa o problema de CWG 903 no modo de conformidade ( /permissive-
). Essa regra não permite a conversão implícita de expressões de constante integral (exceto para o literal inteiro '
0 ') para constantes de ponteiro NULL. O exemplo a seguir produz C2440 no modo de conformidade:
int* f(bool* p) {
p = false; // error C2440: '=': cannot convert from 'bool' to 'bool *'
p = 0; // OK
return false; // error C2440: 'return': cannot convert from 'bool' to 'int *'
}
Para corrigir o erro, use nullptr em vez de false . Um literal 0 ainda é permitido:
int* f(bool* p) {
p = nullptr; // OK
p = 0; // OK
return nullptr; // OK
}
Essa alteração pode levar a geração de diagnósticos de aviso diferentes e diferenças de comportamento para
operações aritméticas em literais.
o exemplo a seguir mostra o novo comportamento no Visual Studio 2019 versão 16,4. A i variável agora é do
tipo unsigned int . É por isso que o aviso é gerado. Os bits de ordem superior da variável j são definidos
como 0.
void f(int r) {
int i = 2964557531; // warning C4309: truncation of constant value
long long j = 0x8000000000000000ll >> r; // literal is now unsigned, shift will fill high-order bits
with 0
}
O exemplo a seguir demonstra como manter o comportamento antigo e evitar os avisos e a alteração de
comportamento de tempo de execução:
void f(int r) {
int i = 2964557531u; // OK
long long j = (long long)0x8000000000000000ll >> r; // shift will keep high-order bits
}
template<typename T>
void f(T* buffer, int size, int& size_read);
#include <type_traits>
struct S;
template<>
struct std::is_fundamental<S> : std::true_type {};
static_assert(std::is_fundamental<S>::value, "fail");
Para evitar o erro, defina um struct que herde do preferencial type_trait e specialize que:
#include <type_traits>
struct S;
template<typename T>
struct my_is_fundamental : std::is_fundamental<T> {};
template<>
struct my_is_fundamental<S> : std::true_type { };
static_assert(my_is_fundamental<S>::value, "fail");
struct S {
U operator==(const S&) const;
};
struct U {
operator bool() const;
};
struct S {
U operator==(const S&) const;
U operator!=(const S&) const;
};
O compilador não definirá mais um operador de comparação padrão se for membro de uma classe de união. O
exemplo a seguir agora produz o erro C2120:
#include <compare>
union S {
int a;
char b;
auto operator<=>(const S&) const = default;
};
#include <compare>
union S {
int a;
char b;
auto operator<=>(const S&) const { ... }
};
O compilador não definirá mais um operador de comparação padrão se a classe contiver um membro de
referência. O código a seguir agora produz o erro C2120:
#include <compare>
struct U {
int& a;
auto operator<=>(const U&) const = default;
};
#include <compare>
struct U {
int& a;
auto operator<=>(const U&) const { ... };
};
// In permissive-, this declaration isn't a definition, and the program won't link.
template <> int S<char>::a;
int main() {
return S<char>::a;
}
error LNK2019: unresolved external symbol "public: static int S<char>::a" (?a@?$S@D@@2HA) referenced in
function _main at link time.
int main() {
return S<char>::a;
}
#define m()
line m(
) line
line line
#line 2
line
line
import // Invalid
m; // error C2146: syntax error: missing ';' before identifier 'm'
import m; // OK
A mesclagem de P1959R0 requer que o compilador remova o comportamento e as referências aos tipos
std::weak_equality e std::strong_equality .
struct S {
std::strong_equality operator<=>(const S&) const = default;
};
void f() {
nullptr<=>nullptr;
&f <=> &f;
&S::operator<=> <=> &S::operator<=>;
}
Para resolver o problema, atualize para preferir os operadores relacionais integrados e substitua os tipos
removidos:
#include <compare>
struct S {
std::strong_ordering operator<=>(const S&) const = default; // prefer 'std::strong_ordering'
};
void f() {
nullptr != nullptr; // use pre-existing builtin operator != or ==.
&f != &f;
&S::operator<=> != &S::operator<=>;
}
struct S {
S() = delete;
S(int) { }
};
struct U {
U() = delete;
U(int i): s{ i } { }
S s{};
};
U u{ 0 };
struct S {
S() = delete;
S(int) { }
};
struct U {
U() = delete;
U(int i): s{ i } { }
U u{ 0 };
Você pode obter o efeito do comportamento antigo em todos os modos de linguagem convertendo tipos de
caractere em ou tipos de ponteiro para unsigned int caractere para const void* :
#include <iostream>
int main() {
const wchar_t cw = L'x', *pw = L"meow";
const char16_t c16 = u'x', *p16 = u"meow";
const char32_t c32 = U'x', *p32 = U"meow";
std::cout << (unsigned)cw << ' ' << (const void*)pw << '\n'; // Outputs "120 0052B1C0"
std::cout << (unsigned)c16 << ' ' << (const void*)p16 << '\n'; // Outputs "120 0052B1CC"
std::cout << (unsigned)c32 << ' ' << (const void*)p32 << '\n'; // Outputs "120 0052B1D8"
std::wcout << (unsigned)c16 << ' ' << (const void*)p16 << '\n'; // Outputs "120 0052B1CC"
std::wcout << (unsigned)c32 << ' ' << (const void*)p32 << '\n'; // Outputs "120 0052B1D8"
}
Anteriormente, MSVC implementação das regras de promoção para o tipo de retorno do modelo de função
std::pow() estava incorreta. Por exemplo, retornou pow(complex<float>, int) anteriormente complex<float> .
Agora, ele retorna corretamente complex<double> . A correção foi implementada incondicionalmente para todos
os modos de padrões no Visual Studio 2019 versão 16.6.
Essa alteração pode causar erros do compilador. Por exemplo, anteriormente, você podia multiplicar
pow(complex<float>, int) por um float . Como espera argumentos do mesmo tipo, o exemplo a seguir
complex<T> operator* agora emite o erro do compilador C2676:
// pow_error.cpp
// compile by using: cl /EHsc /nologo /W4 pow_error.cpp
#include <complex>
int main() {
std::complex<float> cf(2.0f, 0.0f);
(void) (std::pow(cf, -1) * 3.0f);
}
pow_error.cpp(7): error C2676: binary '*': 'std::complex<double>' does not define this operator or a
conversion to a type acceptable to the predefined operator
#include <stdbool.h>
int main() {
bool b = true;
switch (b) {
case true: break;
case false: break;
default: break; // C4809: switch statement has redundant 'default' label;
// all possible 'case' labels are given
}
}
#include <stdbool.h>
int main() {
bool b = true;
switch (b) {
case true: break;
case false: break;
}
}
Classes sem nome em typedef declarações
A partir Visual Studio 2019 versão 16.6, o comportamento das declarações foi restrito para estar em
conformidade com typedef P1766R1. Com essa atualização, classes sem nome dentro typedef de uma
declaração não podem ter membros diferentes de:
membros de dados não estáticos sem inicializadores de membro padrão,
classes membro ou
enumerações de membro.
As mesmas restrições são aplicadas recursivamente a cada classe aninhada. A restrição serve para garantir a
simplicidade dos structs que têm typedef nomes para fins de vinculação. Eles devem ser simples o suficiente
para que nenhum cálculo de vinculação seja necessário antes que o compilador chegue typedef ao nome para
vinculação.
Essa alteração afeta todos os modos de padrões do compilador. Nos modos ( ) e padrão, o compilador emite o
aviso /std:c++14 /std:c++17 C5208 para código não compatível. Se for especificado, o compilador emitirá o
aviso C5208 como um erro em e emitirá o erro /permissive- /std:c++14 C7626 em /std:c++17 . O
compilador emite o erro C7626 para código não compatível quando /std:c++latest é especificado.
O exemplo a seguir mostra os constructos que não são mais permitidos em structs sem nome. Dependendo do
modo de padrões especificado, erros ou avisos C5208 ou C7626 são emitidos:
struct B { };
typedef struct : B { // inheriting from 'B'; ill-formed
void f(); // ill-formed
static int i; // ill-formed
struct U {
void f(); // nested class has non-data member; ill-formed
};
int j = 10; // default member initializer; ill-formed
} S;
O código acima pode ser corrigido dando um nome à classe sem nome:
struct B { };
typedef struct S_ : B {
void f();
static int i;
struct U {
void f();
};
int j = 10;
} S;
public class R {
public void Func(string s) {} // overload 1
public void Func(string s, string s2 = "") {} // overload 2;
}
Quando essa classe é importada para C++/CLI, uma chamada para uma das sobrecargas causa um erro:
(gcnew R)->Func("abc"); // error C2668: 'R::Func' ambiguous call to overloaded function
O compilador emite o erro C2668 porque ambas as sobrecargas corresponderem a essa lista de argumentos.
Na segunda sobrecarga, o segundo argumento é preenchido pelo argumento padrão. Para resolver esse
problema, você pode excluir a sobrecarga redundante (1). Ou use a lista de argumentos completa e fornece
explicitamente os argumentos padrão.
#include <type_traits>
struct S
{
volatile int m;
};
static_assert(std::is_trivially_copyable_v<S>, "Meow!");
Esse código não é compilado em versões do MSVC anteriores Visual Studio 2019 versão 16.7. Há um aviso do
compilador off-by-default que você pode usar para detectar essa alteração. Se você compilar o código acima
usando cl /W4 /w45220 , verá o seguinte aviso:
warning C5220: `'S::m': a non-static data member with a volatile qualified type no longer implies that
compiler generated copy/move constructors and copy/move assignment operators are non trivial`
Conversões literais de ponteiro para membro e cadeia de caracteres para bool estão restringindo
Recentemente, o comitê C++ Standard aprovou o Relatório de Defeito P1957R2,que considera como uma T*
bool conversão de restrição. MSVC correção de um bug em sua implementação, que diagnosticaria
anteriormente como T* estreitamento, mas não diagnosticou a conversão de um literal de cadeia de caracteres
em ou um ponteiro para membro bool bool para bool .
O programa a seguir está mal formado no Visual Studio 2019 versão 16.7:
struct X { bool b; };
void f(X);
int main() {
f(X { "whoops?" }); // error: conversion from 'const char [8]' to 'bool' requires a narrowing conversion
Para corrigir esse código, adicione comparações explícitas a ou evite contextos em que as conversões de
restrição nullptr estão mal formadas:
struct X { bool b; };
void f(X);
int main() {
f(X { "whoops?" != nullptr }); // Absurd, but OK
Na maioria dos casos, o erro pode ser corrigido substituindo nullptr por , conforme mostrado neste false
exemplo:
struct S { bool b; };
void g(bool);
bool h() { return nullptr; } // error, should be 'return false;'
int main() {
bool b1 = nullptr; // error: cannot convert from 'nullptr' to 'bool'
S s { nullptr }; // error: cannot convert from 'nullptr' to 'bool'
g(nullptr); // error: cannot convert argument 1 from 'nullptr' to 'bool'
struct B {
explicit B() {}
};
void f() {
B b1[1]{}; // Error in /permissive-, because aggregate init calls explicit ctor
B b2[1]; // OK: calls default ctor for each array element
}
Nas versões anteriores, o construtor inicializaria incorretamente o membro de dados Inner antes do membro
de dados v . (O padrão C++ requer uma ordem de inicialização igual à ordem de declaração dos membros).
Agora que o código gerado segue o padrão, a member-init-list está fora de ordem. O compilador gera um aviso
para este exemplo. Para corrigi-lo, reordene a member-initializer-list para refletir a ordem da declaração.
Resolução de sobrecarga envolvendo sobrecargas e long argumentos integrais
O padrão C++ requer a classificação de um long para int conversão como uma conversão padrão. Os MSVC
compiladores anteriores o classificam incorretamente como uma promoção integral, que classifica mais alto
para resolução de sobrecarga. Essa classificação pode fazer com que a resolução de sobrecarga seja resolvida
com êxito quando ela deve ser considerada ambígua.
O compilador agora considera a classificação corretamente no /permissive- modo . O código inválido é
diagnosticada corretamente, como neste exemplo:
int main() {
long x {};
f(x); // error: 'f': ambiguous call to overloaded function
f(static_cast<int>(x)); // OK
}
int main()
{
return x; // Use of 'x' that no other translation unit can possibly define.
}
Esse programa anteriormente compilado e vinculado incorretamente, mas agora emitirá o erro C7631.
error C7631: 'anonymous-namespace::x': variable with internal linkage declared but not defined
Essas variáveis devem ser definidas na mesma unidade de tradução em que são usadas. Por exemplo, você pode
fornecer um inicializador explícito ou uma definição separada.
Conclusão do tipo e conversões de ponteiro derivadas para base
Em padrões C++ antes do C++20, uma conversão de uma classe derivada para uma classe base não exigia que
a classe derivada fosse um tipo de classe completo. O comitê padrão do C++ aprovou uma alteração retroativa
do Relatório de Defeitos que se aplica a todas as versões da linguagem C++. Essa alteração alinha o processo de
conversão com características de tipo, como , que exigem que a classe derivada std::is_base_of seja um tipo
de classe completo.
Veja um exemplo:
struct W { };
struct X { };
struct Y { };
// With this change this code will fail as Z1 is not a complete class type
struct Z1 : X, check_derived_from<Z1, X>
{
};
// This code failed before and it will still fail after this change
struct Z2 : check_derived_from<Z2, Y>, Y
{
};
// With this change this code will fail as Z3 is not a complete class type
struct Z3 : W
{
check_derived_from<Z3, W> cdf;
};
Essa alteração de comportamento se aplica a todos os modos de linguagem C++ MSVC, não apenas
/std:c++latest .
void f(E e) {
S s = { e }; // warning: conversion from 'E' to 'int' requires a narrowing conversion
S s1 = { static_cast<int>(e) }; // Suppress warning with explicit conversion
}
S f();
void g()
{
auto p1 = &(f()); // The temporary returned by 'f' is destructed after this statement. So 'p1' points to
an invalid object.
const auto &r = f(); // This extends the lifetime of the temporary returned by 'f'
auto p2 = &r; // 'p2' points to a valid object
}
// common.h
struct S {
template<typename T> void f(T);
template<> void f(int);
};
// a.cpp
#include "common.h"
int main() {}
// b.cpp
#include "common.h"
class Node {
public:
int index() const;
};
template<typename T>
int compare(T x, T y)
{
return x < y ? -1 : (x > y ? 1 : 0);
}
template<typename T>
int compare(T x, T y) requires !std::is_abstract_v<T>
{
return x < y ? -1 : (x > y ? 1 : 0);
}
Ou, se os conceitos do C++ não estiverem disponíveis, você poderá fazer fallback para SFINAE:
Suporte para P0960R3-permitir a inicialização de agregações de uma lista de valores entre parênteses
O c++ 20 P0960R3 adiciona suporte para inicializar uma agregação usando uma lista de inicializadores entre
parênteses. Por exemplo, o código a seguir é válido em C++ 20:
struct S {
int i;
int j;
};
S s(1, 2);
A maior parte desse recurso é aditiva, ou seja, o código agora compila que não foi compilado antes. No entanto,
ele altera o comportamento de std::is_constructible . No modo C++ 17 static_assert , isso falha, mas no
modo c++ 20 tem êxito:
Se você usar esse tipo de característica para controlar a resolução de sobrecarga, isso poderá levar a uma
alteração no comportamento entre C++ 17 e C++ 20.
Resolução de sobrecarga envolvendo modelos de função
Anteriormente, o compilador permitia a compilação de algum código /permissive- que não deveria ser
compilado. O efeito foi, o compilador chamou a função incorreta que leva a uma alteração no comportamento
do tempo de execução:
int f(int);
namespace N
{
using ::f;
template<typename T>
T f(T);
}
template<typename T>
void g(T&& t)
{
}
void h()
{
using namespace N;
g(f);
}
A chamada para g usa um conjunto de sobrecarga que contém duas funções, ::f e N::f . Como N::f é um
modelo de função, o compilador deve tratar o argumento da função como um contexto não deduzido. Isso
significa que, nesse caso, a chamada para g deve falhar, pois o compilador não pode deduzir um tipo para o
parâmetro de modelo T . Infelizmente, o compilador não descartava o fato de que ele já tinha decidido que
::f era uma boa correspondência para a chamada de função. Em vez de emitir um erro, o compilador geraria
código para chamar g usando ::f como argumento.
Considerando que, em muitos casos ::f , usar como o argumento da função é o que o usuário espera, só
emitiremos um erro se o código for compilado com /permissive- .
Migrando do /await para c++ 20 corrotinas
As corotinas padrão do C++ 20 estão agora ativadas por padrão em /std:c++latest . Eles diferem do TS de
corrotinas e do suporte sob a /await opção. A migração do /await para as corotinas padrão pode exigir
algumas alterações de origem.
Palavras-chave não padrão
await yieldNão há suporte para as palavras-chave e antigas no modo c++ 20. O código deve usar co_await
e co_yield , em vez disso. O modo padrão também não permite o uso de return em uma corrotina. Cada
return um em uma corrotina deve usar co_return .
// /await
task f_legacy() {
...
await g();
return n;
}
// /std:c++latest
task f() {
...
co_await g();
co_return n;
}
Tipos de initial_suspend/final_suspend
Em /await , as funções Promise inicial e suspender podem ser declaradas como retornando bool . Esse
comportamento não é padrão. No C++ 20, essas funções devem retornar um tipo de classe awaitable,
geralmente um dos tipos comuns de espera: std::suspend_always se a função foi retornada anteriormente
true ou std::suspend_never se ela foi retornada false .
// /await
struct promise_type_legacy {
bool initial_suspend() noexcept { return false; }
bool final_suspend() noexcept { return true; }
...
};
// /std:c++latest
struct promise_type {
auto initial_suspend() noexcept { return std::suspend_never{}; }
auto final_suspend() noexcept { return std::suspend_always{}; }
...
};
Tipo de yield_value
No C++ 20, a yield_value função Promise deve retornar um awaitable. No /await modo, a yield_value
função foi permitida para retornar void e sempre suspenderia. Essas funções podem ser substituídas por uma
função que retorna std::suspend_always .
// /await
struct promise_type_legacy {
...
void yield_value(int x) { next = x; };
};
// /std:c++latest
struct promise_type {
...
auto yield_value(int x) { next = x; return std::suspend_always{}; }
};
// /await
struct promise_type_legacy {
void set_exception(std::exception_ptr e) { saved_exception = e; }
...
};
// /std:c++latest
struct promise_type {
void unhandled_exception() { saved_exception = std::current_exception(); }
...
};
// /std:c++latest
#include <experimental/generator>
std::experimental::generator<int> my_generator() {
...
co_yield next;
};
O tipo de retorno da return_value função Promise deve ser void . No /await modo, o tipo de retorno pode
ser qualquer coisa e é ignorado. Esse diagnóstico pode ajudar a detectar erros sutis, como quando o autor
assume incorretamente que o valor de retorno de return_value é retornado para um chamador.
// /await
struct promise_type_legacy {
...
int return_value(int x) { return x; } // incorrect, the return value of this function is unused and the
value is lost.
};
// /std:c++latest
struct promise_type {
...
void return_value(int x) { value = x; }; // save return value
};
// Under /await the promise gets constructed using the default constructor.
// Under /std:c++latest the promise gets constructed using the 1-argument constructor.
f1(0);
struct Object {
template <typename T> operator T() { ... } // Converts to anything!
};
// Under /await the promise gets constructed using the default constructor
// Under /std:c++latest the promise gets copy- or move-constructed from the result of
// Object::operator coro::promise_type().
f2(Object{});
O suporte a módulos do c++ 20 está ativado por padrão em /std:c++latest . para obter mais informações
sobre essa alteração e os cenários em que module e import são tratados condicionalmente como palavras-
chave, consulte suporte a módulos padrão do c++ 20 com MSVC no Visual Studio 2019 versão 16,8.
Como um pré-requisito para suporte a módulos, permissive- agora é habilitado quando /std:c++latest é
especificado. Para obter mais informações, confira /permissive- .
Para o código que foi compilado anteriormente no /std:c++latest e requer comportamentos de compilador
não conformes, /permissive pode ser especificado para desativar o modo de conformidade estrito no
compilador. A opção do compilador deve aparecer depois /std:c++latest na lista de argumentos da linha de
comando. No entanto, /permissive o resultará em um erro se o uso de módulos for detectado:
erro C1214: os módulos estão em conflito com o comportamento não padrão solicitado via 'Option'
a /experimental:module opção ainda é necessária para usar os std.* módulos fornecidos com o Visual Studio,
porque eles ainda não foram padronizados.
A /experimental:module opção também implica /Zc:twoPhase e /Zc:hiddenFriend . Anteriormente, o código
compilado com módulos às vezes poderia ser compilado com /Zc:twoPhase- se o módulo fosse consumido
apenas. Não há mais suporte para esse comportamento.
struct A { };
struct B {
explicit B(const A&);
};
void f()
{
A a;
const B& b1(a); // Always an error
const B& b2{ a }; // Allowed before resolution to CWG 2267 was adopted: now an error
}
class V {
public:
virtual ~V() noexcept(false);
};
class B : virtual V {
virtual void foo () = 0;
// BEFORE: implicitly defined virtual ~B() noexcept(true);
// AFTER: implicitly defined virtual ~B() noexcept(false);
};
class D : B {
virtual void foo ();
// implicitly defined virtual ~D () noexcept(false);
};
Antes dessa alteração, o destruidor implicitamente definido para B was noexcept , porque apenas subobjetos
possivelmente construídos são considerados. E, a classe base V não é um subobjeto potencialmente
construído, porque é uma virtual base e B é abstrata. No entanto, a classe base V é um subobjeto
potencialmente construído da classe D e, portanto D::~D , é determinada como sendo noexcept(false) ,
levando a uma classe derivada com uma especificação de exceção mais fraca do que sua base. Essa
interpretação não é segura. Pode levar a um comportamento de tempo de execução incorreto se uma exceção
for gerada de um destruidor de uma classe derivada de B.
Com essa alteração, um destruidor também será potencialmente a lançar se tiver um destruidor virtual e
qualquer classe base virtual tiver um destruidor potencialmente em lançamento.
Tipos semelhantes e associação de referência
O problema CWG 2352 do Grupo de Trabalho Principal lida com uma inconsistência entre as regras de
associação de referência e as alterações na similaridade de tipo. A inconsistência foi introduzida em relatórios de
defeito anteriores (como CWG 330). Com essa alteração, o código que anteriormente vinculava uma referência
a um temporário agora pode ser vinculado diretamente quando os tipos envolvidos diferem apenas por
qualificadores cv.
Visual Studio 2019 versão 16.9 implementa o comportamento alterado em todos os /std modos do
compilador. É potencialmente uma alteração da origem.
Este exemplo mostra o comportamento alterado:
int *ptr;
const int *const &f() {
return ptr; // Now returns a reference to 'ptr' directly.
// Previously returned a reference to a temporary and emitted C4172
}
int func() {
int i1 = 13;
int i2 = 23;
// Prior to CWG 2352 iptrcref should be bound to a temporary and still points to the value 13.
// After CWG 2352 it is bound directly to iptr and now points to the value 23.
iptr = &i2;
if (*iptrcref != 23)
{
return 1;
}
return 0;
}
Nesse caso, a primeira opção /Zc:twoPhase habilita a pesquisa estrita de nome de duas fases. A segunda opção
é destinada a desabilitar o modo de conformidade estrito (é o oposto de ), mas /permissive- não desabilitou
/Zc:twoPhase .
Visual Studio 2019 versão 16.9 altera esse comportamento em todos os /std modos do compilador.
/Zc:twoPhase e /Zc:twoPhase- não são mais "sticky", e as opções posteriores podem substituí-las.
#include <compare>
struct S {
auto operator<=>(const S&) const = default;
operator bool() const;
};
bool f(S a, S b) {
return a < b;
}
No entanto, o compilador não invocaria a função de comparação que o autor poderia esperar. O código acima
deve ter reescrito a < b como (a <=> b) < 0 . Em vez disso, o compilador usou a operator bool() função de
conversão definida pelo usuário e comparou bool(a) < bool(b) . A partir Visual Studio versão 16.9 de 2019, o
compilador reescreve a expressão usando a expressão de operador de nave espacial esperada.
Alteração da falha de origem
A aplicação correta de conversões a expressões reescritas tem outro efeito: o compilador também diagnostica
corretamente ambiguidades de tentativas de reescrever a expressão. Considere este exemplo:
struct Base {
bool operator==(const Base&) const;
};
No C++17, esse código seria aceito devido à conversão derivada para base de no lado direito Derived da
expressão. No C++20, o candidato à expressão sintetizada também é adicionado: Derived{} == Base{} . Devido
às regras no padrão sobre qual função vence com base em conversões, acontece que a escolha entre e
Base::operator== Derived::operator== é indecidável. Isso porque as sequências de conversão nas duas
expressões não são melhores ou piores do que as outras, portanto, o código de exemplo resulta em uma
ambiguidade.
Para resolver a ambiguidade, adicione um novo candidato que não estará sujeito às duas sequências de
conversão:
struct iterator;
struct const_iterator {
const_iterator(const iterator&);
bool operator==(const const_iterator &ci) const;
};
struct iterator {
bool operator==(const const_iterator &ci) const { return ci == *this; }
};
$ cl /std:c++latest /c t.cpp
t.cpp
t.cpp(8): warning C5232: in C++20 this comparison calls 'bool iterator::operator ==(const const_iterator &)
const' recursively
struct Base
{
operator char *();
};
struct S {
S(int, const S*);
S s(4, &s);
O compilador não declararia a variável até analisar a s declaração inteira, incluindo os argumentos do
construtor. A lookup do s na lista de argumentos do construtor falharia. A partir Visual Studio 2019 versão
16.10, este exemplo agora é compilado corretamente.
Infelizmente, essa alteração pode quebrar o código existente, como neste exemplo:
Em versões anteriores do compilador, quando ele pesquisa nos argumentos do construtor para a declaração
"interna" de , ele localiza a declaração anterior ("externa" ) e o código s s é s compilado. A partir da versão
16.10, o compilador emite o aviso C4700. Isso porque o compilador agora declara o "interno" antes s de
analisar os argumentos do construtor. Portanto, s a procura localiza o "interno", s que ainda não foi
inicializado.
Membro explicitamente especializado de um modelo de classe
Versões anteriores do compilador marcaram incorretamente uma especialização explícita de um membro de
modelo de classe como se ele também tivesse sido inline definido no modelo primário. Esse comportamento
significa que o compilador às vezes rejeitaria o código em conformidade. A partir Visual Studio 2019 versão
16.10, uma especialização explícita não é mais marcada implicitamente como inline no /permissive- modo .
Considere este exemplo:
// s.h
template<typename T>
struct S {
int f() { return 1; }
};
template<> int S<int>::f() { return 2; }
// s.cpp
#include "s.h"
// main.cpp
#include "s.h"
int main()
{
}
Para resolver o erro do linker no exemplo acima, inline adicione explicitamente a S<int>::f :
template<> inline int S<int>::f() { return 2; }
Surpreendentemente, o tipo de retorno seria omitido de devido a outro comportamento semântico causado
pelo g lambda local no corpo da função. Essa inconsistência dificultava a implementação de funções
exportadas que têm um tipo de retorno deduzido: a interface do módulo requer informações sobre como o
corpo de uma função foi compilado. Ele precisa das informações para produzir uma função no lado de
importação que possa vincular corretamente à definição.
O compilador agora omite o tipo de retorno de uma função de tipo de retorno deduzida. Esse comportamento é
consistente com outras implementações principais. Há uma exceção para modelos de função: esta versão do
compilador apresenta um novo comportamento de nome emaranhado para modelos de função que têm um
tipo de retorno deduzido:
Os nomes emaranhados auto para e agora aparecem no decltype(auto) binário, não no tipo de retorno
deduzido:
As versões anteriores do compilador incluiriam o tipo de retorno deduzido como parte da assinatura. Quando o
compilador incluiu o tipo de retorno no nome emaranhado, ele pode causar problemas do vinculador. Alguns
cenários bem formados se tornariam ambíguos para o vinculador.
O novo comportamento do compilador pode produzir uma alteração de quebra binária. Considere este
exemplo:
// a.cpp
auto f() { return 1; }
// main.cpp
int f();
int main() { f(); }
Em versões anteriores à versão 16.10, o compilador produzia um nome para que se parecesse com , mesmo
que elas sejam auto f() int f() funções semanticamente distintas. Isso significa que o exemplo seria
compilado. Para corrigir o problema, não confie na auto definição original de f . Em vez disso, escreva-o
como int f() . Como as funções que deduziram tipos de retorno são sempre compiladas, as implicações da
ABI são minimizadas.
Aviso para atributo nodiscard ignorado
As versões anteriores do compilador ignoram silenciosamente determinados usos de um nodiscard atributo.
Eles ignoraram o atributo se ele estava em uma posição sintática que não se aplicava à função ou classe que
está sendo declarada. Por exemplo:
a partir do Visual Studio 2019 versão 16,10, o compilador emite o aviso de nível 4 C5240 em vez disso:
Para corrigir esse problema, mova o atributo para a posição sintática correta:
Aviso para include diretivas com nomes de cabeçalho do sistema no módulo alcance
a partir do Visual Studio 2019 versão 16,10, o compilador emite um aviso para evitar um erro de criação de
interface de módulo comum. Se você incluir um cabeçalho de biblioteca padrão após uma export module
instrução, o compilador emitirá o aviso C5244. Veja um exemplo:
export module m;
#include <vector>
export
void f(std::vector<int>);
O desenvolvedor provavelmente não pretendia m que o módulo tenha o conteúdo <vector> . O compilador
agora emite um aviso para ajudar a localizar e corrigir o problema:
m.ixx(2): warning C5244: '#include <vector>' in the purview of module 'm' appears erroneous. Consider moving
that directive before the module declaration, or replace the textual inclusion with an "import <vector>;".
m.ixx(1): note: see module 'm' declaration
Para corrigir esse problema, mova #include <vector> antes de export module m; :
#include <vector>
export module m;
export
void f(std::vector<int>);
Aviso para funções de vinculação internas não usadas
a partir do Visual Studio 2019 versão 16,10, o compilador avisa em mais situações em que uma função não
referenciada com vínculo interno foi removida. As versões anteriores do compilador emitirão o aviso C4505
para o seguinte código:
static void f() // warning C4505: 'f': unreferenced function with internal linkage has been removed
{
}
O compilador agora também avisa sobre funções não referenciadas auto e funções não referenciadas em
namespaces anônimos. Ele emite um aviso C5245 por padrão para as duas funções a seguir:
namespace
{
void f1() // warning C5245: '`anonymous-namespace'::f1': unreferenced function with internal linkage has
been removed
{
}
}
auto f2() // warning C5245: 'f2': unreferenced function with internal linkage has been removed
{
return []{ return 13; };
}
struct S1 {
int i, j;
};
struct S2 {
S1 s1;
int k;
};
S2 s2{ 1, 2, 3 }; // warning C5246: 'S2::s1': the initialization of a subobject should be wrapped in braces
S2 s2{ { 1, 2 }, 3 };
As versões anteriores do compilador permitiam que esse código fosse compilado, embora S::i não tenha sido
inicializado.
Para corrigir esse problema, inicialize todos os membros antes de criar uma const instância de um objeto:
struct S {
int i = 1;
int j = 2;
};
Confira também
Conformidade da linguagem C/C++ da Microsoft
melhorias de conformidade do C++, alterações de
comportamento e correções de bugs no Visual
Studio 2017
03/07/2021 • 56 minutes to read
o Microsoft C/C++ no Visual Studio (MSVC) faz melhorias de conformidade e correções de bugs em todas as
versões. Este artigo lista as melhorias por versão principal e depois pela versão. Para saltar diretamente para as
alterações de uma versão específica, use a lista abaixo neste ar tigo .
este documento lista as alterações no Visual Studio 2017. para obter um guia sobre as alterações no Visual
Studio 2019, consulte melhorias de conformidade do C++ no Visual Studio 2019. Para obter uma lista completa
de melhorias de conformidade anteriores, consulte Visual C++ novidades de 2003 a 2015.
As expressões declaradas como constexpr agora podem conter determinados tipos de declarações, instruções
IF e switch, instruções de loop e mutação de objetos cujo tempo de vida começou dentro da constexpr
avaliação da expressão. Não há mais um requisito de que uma constexpr função de membro não estática deva
ser implicitamente const . Para obter mais informações, consulte relaxando restrições em constexpr funções.
C++ 17: conciso static_assert
o parâmetro de mensagem para static_assert é opcional. Para obter mais informações, consulte N3928:
Estendendo static_assert, v2.
C++17: atributo [[fallthrough]]
No /std:c++17 modo, o [[fallthrough]] atributo pode ser usado no contexto de instruções switch como uma
dica para o compilador que o comportamento de passagem é pretendido. Esse atributo impede o compilador de
emitir avisos em tais casos. Para obter mais informações, consulte P0188R0 para o [[fallthrough]] atributo.
Loops baseados em intervalo generalizados for
for Os loops baseados em intervalo não exigem mais que begin() e end() retornem objetos do mesmo tipo.
Essa alteração permite que o end() retorne um sentinela como usado por intervalos no range-v3 e a
especificação técnica de intervalos concluídos, mas não, bem publicados. Para obter mais informações, consulte
P0184R0-generalizando o for Loop de Range-Based.
Inicialização de lista de cópia
Visual Studio 2017 gera corretamente erros de compilador relacionados à criação de objetos usando listas de
inicializadores. esses erros não foram capturados no Visual Studio 2015 e podem levar a falhas ou
comportamento indefinido do tempo de execução. De acordo com o N4594 13.3.1.7 P1, no
copy-list-initialization , o compilador é necessário para considerar um construtor explícito para resolução de
sobrecarga. No entanto, ele deve gerar um erro se essa sobrecarga específica for escolhida.
Os dois exemplos a seguir são compilados no Visual Studio 2015, mas não no Visual Studio 2017.
struct A
{
explicit A(int) {}
A(double) {}
};
int main()
{
A a1 = { 1 }; // error C3445: copy-list-initialization of 'A' cannot use an explicit constructor
const A& a2 = { 1 }; // error C2440: 'initializing': cannot convert from 'int' to 'const A &'
A a1{ 1 };
const A& a2{ 1 };
no Visual Studio 2015, o compilador incorretamente tratava a inicialização da lista de cópia da mesma maneira
que a inicialização de cópia regular: ela considerou apenas converter construtores para resolução de
sobrecarga. no exemplo a seguir, Visual Studio o 2015 escolhe MyInt(23) . Visual Studio 2017 gera o erro
corretamente.
// From http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1228
struct MyStore {
explicit MyStore(int initialCapacity);
};
struct MyInt {
MyInt(int i);
};
struct Printer {
void operator()(MyStore const& s);
void operator()(MyInt const& i);
};
void f() {
Printer p;
p({ 23 }); // C3066: there are multiple ways that an object
// of this type can be called with these arguments
}
Esse exemplo é semelhante ao anterior, mas gera um erro diferente. ele tem êxito no Visual Studio 2015 e falha
em Visual Studio 2017 com C2668.
struct A {
explicit A(int) {}
};
struct B {
B(int) {}
};
int main()
{
f({ 1 }); // error C2668: 'f': ambiguous call to overloaded function
}
Typedefs preteridos
Visual Studio 2017 agora emite o aviso correto para typedefs preteridos declarados em uma classe ou estrutura.
o exemplo a seguir compila sem avisos no Visual Studio 2015. ele produz C4996 no Visual Studio 2017.
struct A
{
// also for __declspec(deprecated)
[[deprecated]] typedef int inttype;
};
int main()
{
A::inttype a = 0; // C4996 'A::inttype': was declared deprecated
}
constexpr
Visual Studio 2017 gera um erro corretamente quando o operando à esquerda de uma operação de avaliação
condicional não é válido em um constexpr contexto. o código a seguir é compilado no Visual Studio 2015, mas
não em Visual Studio 2017, onde ele gera C3615:
template<int N>
struct array
{
int size() const { return N; }
};
Para corrigir o erro, declare a array::size() função como constexpr ou remova o constexpr qualificador de
f .
int main()
{
std::atomic<int> i(0);
printf("%i\n", i); // error C4839: non-standard use of class 'std::atomic<int>'
// as an argument to a variadic function.
// note: the constructor and destructor will not be called;
// a bitwise copy of the class will be passed as the argument
// error C2280: 'std::atomic<int>::atomic(const std::atomic<int> &)':
// attempting to reference a deleted function
struct S {
S(int i) : i(i) {}
S(const S& other) : i(other.i) {}
operator int() { return i; }
private:
int i;
} s(0);
printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
// as an argument to a variadic function
}
Para corrigir o erro, é possível chamar uma função membro que retorna um tipo facilmente copiado,
std::atomic<int> i(0);
printf("%i\n", i.load());
Para cadeias de caracteres criadas e gerenciadas usando CString , o fornecido operator LPCTSTR() deve ser
usado para converter um CString objeto para o ponteiro C esperado pela cadeia de caracteres de formato.
CString str1;
CString str2 = _T("hello!");
str1.Format(_T("%s"), static_cast<LPCTSTR>(str2));
struct S
{
S(int);
operator int();
};
#include <type_traits>
int main()
{
f(10); // C2672: No matching overloaded function found.
}
Expressão SFINAE
Para dar suporte ao Expression-SFINAE, o compilador agora analisa decltype argumentos quando os modelos
são declarados em vez de instanciados. Portanto, se uma especialização não dependente for encontrada no
argumento decltype, ela não será adiada para o tempo de instanciação. Ela será processada imediatamente, e
qualquer erro resultante será diagnosticado nesse momento.
O exemplo a seguir mostra esse erro do compilador gerado no momento da declaração:
#include <utility>
template <class T, class ReturnT, class... ArgsT>
class IsCallable
{
public:
struct BadType {};
value struct V
{
int i = 0; // error C3446: 'V::i': a default member initializer
// isn't allowed for a member of a value class
};
using System.Reflection;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
[DefaultMember("Value")]
public class Class1
{
public int Value
{
// using attribute on the return type triggers the compiler bug
[return: MarshalAs(UnmanagedType.I4)]
get;
}
}
[DefaultMember("Value")]
public class Class2
{
public int Value
{
get;
}
}
}
// code.cpp
#using "class1.dll"
No Visual Studio de 2017, é possível acessar ambas as propriedades Value pelo nome:
#using "class1.dll"
O novo atributo [[maybe_unused]] silencia avisos quando uma entidade não é usada. O atributo [[nodiscard]]
criará um aviso se o valor retornado de uma chamada de função for descartado. Para saber mais, veja Atributos
em C++.
Uso de namespaces de atributo sem repetição
Nova sintaxe para permitir apenas um único identificador de namespace em uma lista de atributos. Para saber
mais, veja Atributos em C++.
Associações estruturadas
Agora é possível, em uma única declaração, armazenar um valor com nomes individuais de seus componentes,
quando o valor é uma matriz, um std::tuple ou std::pair , ou tem todos os membros de dados não estáticos
públicos. Para obter mais informações, consulte associações estruturadas P0144R0 e retornando vários valores
de uma função.
Regras de construção para valores enum class
Agora há uma conversão implícita para enumerações com escopo que não são restritas. Ele converte de um tipo
subjacente de enumeração com escopo para a própria enumeração. A conversão está disponível quando sua
definição não introduz um enumerador e quando a origem usa uma sintaxe de inicialização de lista. Para obter
mais informações, consulte regras de construção de P0138R2 para enum class valores e enumerações.
Capturar *this por valor
O *this objeto em uma expressão lambda agora pode ser capturado por valor. Essa mudança permite cenários
nos quais o lambda é invocado em operações paralelas e assíncronas, especialmente em arquiteturas de
computadores mais recentes. Para obter mais informações, consulte P0018R3-lambda capturada * por valor
como [ =, * isto ] .
Remover operator++ para bool
operator++ Não é mais suportado em bool tipos. Para obter mais informações, consulte P0002R1-remove
Preterited Operator + + (bool).
Remover a palavra-chave register preterida
A register palavra-chave, anteriormente preterida (e ignorada pelo compilador), agora é removida da
linguagem. Para obter mais informações, consulte P0001R1-remove preterido uso da register palavra-chave.
Chamadas para modelos de membros excluídos
nas versões anteriores do Visual Studio, o compilador em alguns casos não emitiria um erro para chamadas
malformadas para um modelo de membro excluído. Essas chamadas poderiam causar falhas em tempo de
execução. O código a seguir agora produz C2280:
template<typename T>
struct S {
template<typename U> static int f() = delete;
};
void g()
{
decltype(S<int>::f<int>()) i; // this should fail with
// C2280: 'int S<int>::f<int>(void)': attempting to reference a deleted function
}
struct S;
enum E;
class A
{
public:
A() : p_(new int) {}
~A() { delete p_; }
private:
int *p_;
};
#pragma unmanaged
void f(A a)
{
}
#pragma managed
int main()
{
// This call from managed to native requires marshaling. The CLR doesn't
// understand C++ and uses BitBlt, which results in a double-free later.
f(A()); // C4606 'A': passing argument by value across native and managed
// boundary requires valid copy constructor. Otherwise, the runtime
// behavior is undefined.`
}
Para corrigir o erro, remova a diretiva #pragma managed para marcar o chamador como nativo e evitar
marshaling.
Aviso de API experimental para WinRT
As APIs do WinRT lançadas para experimentação e comentários são decoradas com
Windows.Foundation.Metadata.ExperimentalAttribute . no Visual Studio 2017 versão 15,3, o compilador produz o
aviso C4698 para este atributo. Algumas APIs em versões anteriores do SDK do Windows já tinham sido
decoradas com o atributo, e chamadas para essas APIs agora começam a disparar esse aviso do compilador.
SDKs de Windows mais recentes têm o atributo removido de todos os tipos enviados. Se estiver usando um
SDK mais antigo, você precisará suprimir esses avisos para todas as chamadas para os tipos enviados.
O código a seguir produz o aviso C4698:
Windows::Storage::IApplicationDataStatics2::GetForUserAsync(); // C4698
// 'Windows::Storage::IApplicationDataStatics2::GetForUserAsync' is for
// evaluation purposes only and is subject to change or removal in future updates
#pragma warning(push)
#pragma warning(disable:4698)
Windows::Storage::IApplicationDataStatics2::GetForUserAsync();
#pragma warning(pop)
struct S {};
struct S {
template <typename T>
void f(T t);
};
template <typename T>
void S::f(T t) {}
Em C++, this é um não prvalue do tipo ponteiro para X. Você não pode pegar o endereço this ou associá-lo
a uma referência lvalue. Nas versões anteriores do Visual Studio, o compilador permitia contornar essa restrição
com o uso de uma conversão. no Visual Studio 2017 versão 15,3, o compilador produz o erro C2664.
Conversão em uma classe base inacessível
O Visual Studio 2017 versão 15.3 gera um erro quando você tenta converter um tipo em uma classe base que
está inacessível. O código a seguir está malformado e poderá causar uma falha em runtime. O compilador agora
produz C2243 quando vê um código como este:
#include <memory>
class B { };
class D : B { }; // C2243: 'type cast': conversion from 'D *' to 'B *' exists, but is inaccessible
void f()
{
std::unique_ptr<B>(new D());
}
Os argumentos padrão não são permitidos em definições fora de linha de funções de membro
Os argumentos padrão não são permitidos em definições fora da linha de funções de membro em classes de
modelo. O compilador emitirá um aviso em /permissive e um erro de hardware em /permissive- .
Nas versões anteriores do Visual Studio, o código malformado a seguir pode causar uma falha de runtime.
Visual Studio 2017 versão 15,3 produz o aviso C5037:
struct A {
int arr[10];
};
// warning C4841: non-standard extension used: compound member designator used in offsetof
constexpr auto off = offsetof(A, arr[2]);
Para corrigir o código, desabilite o aviso com um pragma ou altere o código para não usar offsetof :
#pragma warning(push)
#pragma warning(disable: 4841)
constexpr auto off = offsetof(A, arr[2]);
#pragma warning(pop)
struct A {
int ten() { return 10; }
static constexpr int two = 2;
};
constexpr auto off = offsetof(A, ten); // C4597: undefined behavior: offsetof applied to member function
'A::ten'
constexpr auto off2 = offsetof(A, two); // C4597: undefined behavior: offsetof applied to static data member
'A::two'
Esse código está malformado e pode causar falhas em runtime. Para corrigir o erro, altere o código para não
invocar mais um comportamento indefinido. Esse é o código não portátil que não é permitido pelo padrão C++.
Novo aviso em atributos __declspec
No Visual Studio 2017 versão 15.3, o compilador não ignora os atributos se __declspec(...) é aplicado antes
da especificação de vinculação extern "C" . Anteriormente, o compilador ignorava o atributo, o que podia ter
implicações de runtime. Quando as /Wall /WX Opções e são definidas, o código a seguir produz o aviso
C4768:
__declspec(noinline) extern "C" HRESULT __stdcall // C4768: __declspec attributes before linkage
specification are ignored
esse aviso está desativado por padrão na versão 15,3 do Visual Studio 2017 e só afeta o código compilado com
/Wall /WX . a partir do Visual Studio 2017 versão 15,5, ele é habilitado por padrão como um aviso de nível 3.
template<typename T>
struct A
{
~A() = delete;
};
template<typename T>
auto f() -> A<T>;
template<typename T>
auto g(T) -> decltype((f<T>()));
void h()
{
g(42); // C2280: 'A<T>::~A(void)': attempting to reference a deleted function
}
struct A {};
template <typename> struct B {};
enum C { c1, c2, c3 };
int; // warning C4091 : '' : ignored on left of 'int' when no variable is declared
A; // warning C4091 : '' : ignored on left of 'main::A' when no variable is declared
B<int>; // warning C4091 : '' : ignored on left of 'B<int>' when no variable is declared
C; // warning C4091 : '' : ignored on left of 'C' when no variable is declared
Para remover os avisos, comente ou remova as declarações vazias. Em casos em que o objeto não nomeado se
destinar a ter um efeito colateral (como RAII), ele deverá receber um nome.
O aviso é excluído em /Wv:18 e está em por padrão no nível de aviso W2.
std::is_convertible para tipos de matriz
As versões anteriores do compilador davam resultados incorretos para std::is_convertible tipos de matriz.
Isso exigia que gravadores de biblioteca tratassem o compilador do Microsoft C++ de forma especial ao usar a
característica de tipo std::is_convertible<...> . No exemplo a seguir, as declarações de estática passam em
versões anteriores do Visual Studio, mas falham no Visual Studio 2017 versão 15.3:
#include <type_traits>
static_assert(std::is_convertible<Array, Array>::value);
static_assert(std::is_convertible<const Array, const Array>::value, "");
static_assert(std::is_convertible<Array&, Array>::value, "");
static_assert(std::is_convertible<Array, Array&>::value, "");
std::is_convertible<From, To> é calculada para verificar se uma definição de função imaginária está bem
formada:
class PrivateDtor {
PrivateDtor(int) { }
private:
~PrivateDtor() { }
};
Os destruidores particulares fazem com que um tipo não seja construível. std::is_constructible<T, Args...> é
calculada como se a declaração a seguir estivesse escrita:
T obj(std::declval<Args>()...)
namespace N {
template<class T>
void f(T&, T&);
template<class T>
void f();
}
template<class T>
void f(T&, T&);
struct S {};
void f()
{
using N::f;
S s1, s2;
f(s1, s2); // C2668: 'f': ambiguous call to overloaded function
}
Para corrigir o código, remova o uso da instrução N::f se você pretende chamar ::f() .
C2660: declarações de função locais e pesquisa dependente de argumento
As declarações de função local ocultam a declaração de função no escopo delimitador e desabilitam a pesquisa
dependente de argumento. As versões anteriores do compilador sempre fizeram uma pesquisa dependente de
argumento nesse caso. Isso poderia levar a um comportamento de runtime inesperado, se o compilador
escolhesse a sobrecarga errada. Normalmente, o erro é devido a uma assinatura incorreta da declaração da
função local. No exemplo a seguir, Visual Studio versão 2017 15.3 gera corretamente o C2660:
struct S {};
void f(S, int);
void g()
{
void f(S); // C2660 'f': function does not take 2 arguments:
// or void f(S, int);
S s;
f(s, 0);
}
struct A
{ // Initialized in reverse, y reused
A(int a) : y(a), x(y) {} // C5038: data member 'A::y' will be initialized after data member 'A::x'
int x;
int y;
};
Para corrigir o problema, organize a lista do inicializador para que tenha a mesma ordem que as declarações.
Um aviso semelhante é gerado quando um ou ambos os inicializadores fazem referência a membros de classe
base.
Esse aviso está off-by-default e afeta apenas o código compilado com /Wall .
Em versões anteriores do Visual Studio, o compilador sempre dava uma vinculação interna variável, mesmo
quando a constexpr variável era marcada extern como . No Visual Studio 2017 versão 15.5, uma nova opção
do compilador, , habilita o comportamento correto e em conformidade /Zc:externConstexpr com os padrões.
Para obter mais informações, consulte extern constexpr vinculação.
Remover especificações de exceção dinâmica
P0003R5 As especificações de exceções dinâmicas foram preteridas no C++11. O recurso foi removido do
C++17, mas a especificação throw() (ainda) preterida é mantida estritamente como um alias para
noexcept(true) . Para obter mais informações, consulte Remoção de noexcept especificação de exceção
dinâmica e .
not_fn()
P0033R1 enable_shared_from_this foi adicionada no C++ 11. O padrão C++17 atualiza a especificação para
lidar melhor com certos casos de canto. [14]
Unir mapas e conjuntos
P0083R3 Esse recurso permite a extração de nós de contêineres associativos (ou seja, , , , ) que podem ser
modificados e inseridos de volta no mesmo contêiner ou em um contêiner diferente que usa o mesmo tipo de
map set unordered_map unordered_set nó. (É um caso de uso comum extrair um nó de um std::map , alterar
a chave e inseri-lo novamente.)
Preterir partes residuais da biblioteca
P0174R2 Vários recursos da biblioteca padrão do C++ foram substituídos por novos recursos ao longo dos
anos, ou porque não se mostraram úteis, ou porque apresentaram problemas. Esses recursos foram
oficialmente preteridos no C++17.
Remover o suporte ao alocador em std::function
P0302R1 Antes do C++17, o modelo de classe tinha std::function vários construtores que levaram um
argumento de alocador. No entanto, o uso de alocadores neste contexto era problemático e a semântica era
confusa. Os construtores de problema foram removidos.
Correções para not_fn()
P0358R1 A nova expressão para std::not_fn dão suporte à propagação de categoria de valor quando usada na
invocação do wrapper.
shared_ptr<T[]> , shared_ptr<T[N]>
P0414R2 Mesclando alterações do shared_ptr dos Princípios básicos de biblioteca para o C++17. [14]
Corrigir shared_ptr para matrizes
P0497R0 Correções para o suporte de shared_ptr para matrizes. [14]
Esclarecer insert_return_type
P0508R0 Os contêineres associativos e não ordenados, ambos com chaves exclusivas, têm uma função de
membro insert que retorna um tipo aninhado insert_return_type . O tipo de retorno agora é definido como
uma especialização de um tipo com parâmetros no iterador e NodeType do contêiner.
Variáveis embutidas para a biblioteca padrão
Para P0607R0, várias variáveis comuns declaradas na biblioteca padrão agora são declaradas em linha.
Recursos preteridos do anexo D
O anexo D do C++ padrão contém todos os recursos que foram preteridos, incluindo shared_ptr::unique() ,
<codecvt> e namespace std::tr1 . Quando a opção do compilador é definida, quase todos os recursos de
biblioteca padrão no Anexo D são marcados /std:c++17 como preterido. Para obter mais informações, consulte
Recursos de biblioteca padrão no Anexo D são marcados como preterido.
O namespace no agora emite um aviso de preterição em por padrão e agora é std::tr2::sys
<experimental/filesystem> removido em por /std:c++14 /std:c++17 padrão.
Melhoria na conformidade em <iostream> , evitando uma extensão não padrão (especializações explícitas na
classe).
A biblioteca padrão agora usa modelos de variável internamente.
A biblioteca padrão foi atualizada em resposta às alterações do compilador C++17. As atualizações incluem a
noexcept adição de no sistema de tipos e a remoção de especificações de exceção dinâmica.
template<typename T>
int f(const T&)
{
return 2;
}
int main()
{
int i = 0;
f(&i); // C2668
}
t161.cpp
t161.cpp(16): error C2668: 'f': ambiguous call to overloaded function
t161.cpp(8): note: could be 'int f<int*>(const T &)'
with
[
T=int*
]
t161.cpp(2): note: or 'int f<int>(int*)'
t161.cpp(16): note: while trying to match the argument list '(int*)'
O problema no exemplo acima é que há duas diferenças nos tipos (const versus não const e pacote versus não
pack). Para eliminar o erro do compilador, remova uma das diferenças. Em seguida, o compilador pode ordenar
sem ambígua as funções.
template<typename... T>
int f(T* ...)
{
return 1;
}
template<typename T>
int f(T&)
{
return 2;
}
int main()
{
int i = 0;
f(&i);
}
Manipuladores de exceção
Manipuladores de referência para o tipo de matriz ou função nunca são uma correspondência para qualquer
objeto de exceção. O compilador agora faz a adoção correta dessa regra e gera um aviso de nível 4, C4843. Ele
também não corresponde mais a um manipulador de ou a um literal de cadeia char* wchar_t* de caracteres
quando é /Zc:strictStrings usado.
int main()
{
try {
throw "";
}
catch (int (&)[1]) {} // C4843 (This should always be dead code.)
catch (void (&)()) {} // C4843 (This should always be dead code.)
catch (char*) {} // This should not be a match under /Zc:strictStrings
}
warning C4843: 'int (&)[1]': An exception handler of reference to array or function type is unreachable, use
'int*' instead
warning C4843: 'void (__cdecl &)(void)': An exception handler of reference to array or function type is
unreachable, use 'void (__cdecl*)(void)' instead
O namespace
std::tr1 é preterido
O namespace não padrão std::tr1 está marcado como preterido nos modos C++14 e C++17. No Visual
Studio 2017 versão 15.5, o código a seguir aciona C4996:
#include <functional>
#include <iostream>
using namespace std;
int main() {
std::tr1::function<int (int, int)> f = std::plus<int>(); //C4996
cout << f(3, 5) << std::endl;
f = std::multiplies<int>();
cout << f(3, 5) << std::endl;
}
warning C4996: 'std::tr1': warning STL4002: The non-standard std::tr1 namespace and TR1-only machinery are
deprecated and will be REMOVED. You can define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING to acknowledge
that you have received this warning.
#include <functional>
#include <iostream>
using namespace std;
int main() {
std::function<int (int, int)> f = std::plus<int>();
cout << f(3, 5) << std::endl;
f = std::multiplies<int>();
cout << f(3, 5) << std::endl;
}
#include <iterator>
#include <type_traits>
Para corrigir o erro, siga as instruções no texto de aviso, conforme demonstrado no código a seguir:
#include <iterator>
class MyIter {
public:
typedef std::random_access_iterator_tag iterator_category;
typedef int value_type;
typedef ptrdiff_t difference_type;
typedef int* pointer;
typedef int& reference;
#include <type_traits>
void f() {
char s[2] = {0}; // C4189. Either use the variable or remove it.
}
Quando o código não precisar ser compatível com versões anteriores, evite o aviso removendo a supressão
C4001 e C4179. Se o código precisar ser compatível com versões anteriores, suprima somente C4619.
/* C only */
#pragma warning(disable:4619)
#pragma warning(disable:4001)
#pragma warning(disable:4179)
Esse novo aviso C4768 é determinado em alguns cabeçalhos do SDK do Windows que foram fornecidos com o
Visual Studio 2017 15.3 ou anterior (por exemplo: versão 10.0.15063.0, também conhecido como SDK do RS2).
No entanto, as versões posteriores dos cabeçalhos do SDK do Windows (especificamente, ShlObj.h e
ShlObj_core.h) foram corrigidas para que não produzam o aviso. Quando você vir esse aviso proveniente de
cabeçalhos do SDK do Windows, poderá executar estas ações:
1. Mude para o SDK do Windows mais recente que acompanha o Visual Studio 2017 versão 15.5.
2. Desligue o aviso ao redor de #include da instrução de cabeçalho do SDK do Windows:
Se um arquivo de cabeçalho contiver uma variável declarada extern constexpr , ele precisará ser marcado
__declspec(selectany) para ter suas declarações duplicadas combinadas corretamente:
#include <typeinfo>
struct S;
std::is_convertible requer que o tipo de destino seja um tipo de retorno válido. Em versões anteriores do
Visual Studio, o compilador permitia incorretamente tipos abstratos, que podem levar à resolução de
sobrecarga incorreta e ao comportamento de runtime imprevisto. O código a seguir agora aciona C2338
corretamente:
#include <type_traits>
Para evitar o erro, você deve comparar tipos de ponteiro ao usar is_convertible , pois uma comparação de tipo
que não é de ponteiro poderá falhar se um tipo for abstrato:
#include <type_traits>
No C++ 17, throw() é um alias para noexcept , throw(<type list>) e throw(...) é removido, e determinados
tipos podem incluir noexcept . Essa mudança pode causar problemas de compatibilidade de origem com o
código que está em conformidade com a C++14 ou anterior. A /Zc:noexceptTypes- opção pode ser usada para
reverter para a versão c++ 14 do noexcept ao usar o modo c++ 17 em geral. Ela permite atualizar seu código-
fonte para estar em conformidade com a C++17 sem precisar reescrever todo o código throw() ao mesmo
tempo.
O compilador agora também diagnostica mais especificações de exceção incompatíveis em declarações no
modo C++ 17 ou com /permissive- o novo aviso C5043.
o código a seguir gera C5043 e C5040 no Visual Studio 2017 versão 15,5 quando a /std:c++17 opção é
aplicada:
struct A {
virtual void f() throw();
};
struct B : A {
virtual void f() { } // error C2694
};
Para remover os erros enquanto estiver usando o /std:c++17 , adicione a /Zc:noexceptTypes- opção à linha de
comando ou atualize seu código para usar noexcept , conforme mostrado no exemplo a seguir:
struct A {
virtual void f() noexcept;
};
struct B : A {
virtual void f() noexcept { }
};
Variáveis embutidas
constexpr Os membros de dados estáticos agora são implicitamente inline , o que significa que sua
declaração dentro de uma classe agora é sua definição. O uso de uma definição fora de linha para um
static constexpr membro de dados é redundante e agora é preterido. no Visual Studio 2017 versão 15,5,
quando a /std:c++17 opção é aplicada, o seguinte código agora produz o aviso C5041:
struct X {
static constexpr int size = 3;
};
const int X::size; // C5041: 'size': out-of-line definition for constexpr static data member is not needed
and is deprecated in C++17
O aviso C4768 de extern "C" __declspec(...) agora está ativado por padrão
O aviso foi adicionado no Visual Studio versão 2017 versão 15.3, mas estava desativado por padrão. No Visual
Studio 2017 versão 15.5, o aviso está ativo por padrão. Para obter mais informações, consulte novo aviso sobre
__declspec atributos.
Funções usadas como padrão e __declspec(nothrow)
O compilador permitia anteriormente que funções padronizadas fossem declaradas com __declspec(nothrow)
quando as funções de base/membro correspondente permitiam exceções. Esse comportamento é contrário ao
padrão C++ e pode causar um comportamento indefinido no runtime. O padrão exige que tais funções sejam
definidas como excluídas se houver uma incompatibilidade de especificação de exceção. Em /std:c++17 , o
código a seguir gera C2280:
struct A {
A& operator=(const A& other) { // No exception specification; this function may throw.
...
}
};
struct B : public A {
__declspec(nothrow) B& operator=(const B& other) = default;
};
int main()
{
B b1, b2;
b2 = b1; // error C2280: attempting to reference a deleted function.
// Function was implicitly deleted because the explicit exception
// specification is incompatible with that of the implicit declaration.
}
Para corrigir esse código, remova o __declspec(nothrow) da função padronizada ou o = default e forneça uma
definição para a função juntamente com qualquer manipulação de exceção necessária:
struct A {
A& operator=(const A& other) {
// ...
}
};
struct B : public A {
B& operator=(const B& other) = default;
};
int main()
{
B b1, b2;
b2 = b1;
}
Com noexcept no sistema de tipos, as especializações parciais para correspondência de tipos "chamáveis"
específicos podem não compilar ou não escolher o modelo primário, devido à ausência de uma especialização
parcial para ponteiros para as funções Except.
Nesses casos, talvez seja necessário adicionar mais especializações parciais para lidar com noexcept ponteiros
de função e noexcept ponteiros para funções de membro. Essas sobrecargas são apenas no /std:c++17 modo
legal. Se for necessário manter a compatibilidade com versões anteriores de C++14 e você estiver escrevendo
código que outras pessoas consumirão, será necessário proteger essas novas sobrecargas dentro de diretivas
#ifdef . Se você estiver trabalhando em um módulo independente, em vez de usar #ifdef as proteções, basta
compilar com a /Zc:noexceptTypes- opção.
O código a seguir é compilado em /std:c++14 , mas falha em /std:c++17 com o erro C2027:
template <>
struct A<void(*)()>
{
static const bool value = true;
};
int main()
{
return g(&f) ? 0 : 1; // C2027: use of undefined type 'A<T>'
}
O código a seguir é executado com sucesso /std:c++17 porque o compilador escolhe a nova especialização
parcial A<void (*)() noexcept> :
template <>
struct A<void(*)()>
{
static const bool value = true;
};
template <>
struct A<void(*)() noexcept>
{
static const bool value = true;
};
int main()
{
return g(&f) ? 0 : 1; // OK
}
struct A {
template<typename T>
A(T, typename T::type = 0);
A(int);
};
struct B : A {
using A::A;
B(int n) = delete; // Error C2280
};
struct A {
template<typename T>
A(T, typename T::type = 0);
A(int);
};
struct B : A {
using A::A;
B(int n)
{
//do something
}
};
No C++ 17, Derived agora é considerado um tipo de agregação. Isso significa que a inicialização de Base por
meio do construtor padrão privado acontece diretamente como parte da regra de inicialização de agregação
estendida. Anteriormente, o construtor privado Base era chamado por meio do construtor Derived , e isso era
bem-sucedido devido à declaração friend. o exemplo a seguir mostra o comportamento do c++ 17 no Visual
Studio versão 15,7 no /std:c++17 modo:
struct Derived;
struct Base {
friend struct Derived;
private:
Base() {}
};
struct Derived : Base {
Derived() {} // add user-defined constructor
// to call with {} initialization
};
Derived d1; // OK. No aggregate init involved.
Derived d2 {}; // error C2248: 'Base::Base': cannot access
// private member declared in class 'Base'
Um dos efeitos desse novo recurso é que o código válido do C++ 14 pode não ser válido ou ter semânticas
diferentes. Por exemplo, algumas sobrecargas que anteriormente eram inválidas, agora são válidas. O exemplo a
seguir mostra um código do C++14 que é compilado porque a chamada a example(p) está associada a
example(void*); . no Visual Studio 2017 versão 15,7, no /std:c++17 modo, o example modelo de função é a
melhor correspondência.
template <int N> struct A;
template <typename T, T N> int example(A<N>*) = delete;
o exemplo a seguir mostra o código c++ 17 no Visual Studio 15,7 no /std:c++17 modo:
P0030R1 Adiciona três novas sobrecargas para std::hypot , para tipos float , double e long double , cada
uma delas tem três parâmetros de entrada.
C++17: <filesystem>
P0218R1 Adota a TS do sistema de arquivos no padrão, com algumas modificações de frase.
C++ 17: funções especiais matemáticas
P0226R1 Adota especificações técnicas anteriores para funções especiais matemáticas no cabeçalho padrão
<cmath> .
C++ 17: guias de dedução para a biblioteca padrão
P0433R2 Atualizações ao STL para aproveitar a adoção do P0091R3 pelo C++17, que adiciona suporte à
dedução de argumento de modelo de classe.
C++ 17: reparar conversões de cadeia de caracteres elementares
P0682R1 Mova as novas funções de conversão de cadeia de caracteres elementares do P0067R5 para um novo
cabeçalho <charconv> e faça outras melhorias, incluindo a alteração do tratamento de erro a ser usado
std::errc em vez de std::error_code .
template<typename T>
struct S {
void f(int = 0);
};
template<typename T>
void S<T>::f(int = 0) {} // Re-definition necessary
no /std:c++17 modo no Visual Studio 2017 versão 15,7, o argumento padrão não é ignorado:
template<typename T>
struct S {
void f(int = 0);
};
template<typename T>
void S<T>::f(int) {} // Default argument is used
template<typename T>
struct B {
using type = T;
};
template<typename T>
struct D : B<T*> {
using type = B<T*>::type;
};
Visual Studio 2017 versão 15,7, no /std:c++17 modo, requer a typename palavra-chave na using instrução em
D. Sem typename , o compilador gera o aviso C4346: 'B<T*>::type': dependent name is not a type e o erro
C2061: syntax error: identifier 'type' :
template<typename T>
struct B {
using type = T;
};
template<typename T>
struct D : B<T*> {
using type = typename B<T*>::type;
};
C++17: Atributo [[nodiscard]] – aumento do nível de aviso
no Visual Studio 2017 versão 15,7 no /std:c++17 modo, o nível de aviso de C4834 é aumentado de W3 para
W1. Você pode desabilitar o aviso com uma conversão para void ou passando /wd:4834 para o compilador.
int main() {
f(); // warning C4834: discarding return value
// of function with 'nodiscard'
}
template<typename T>
struct B {};
template<typename T>
struct D : B<T>
{
template<typename ...C>
D() : B() {} // C2614: D<int>: illegal member initialization: 'B' is not a base or member
};
D<int> d;
#include <array>
struct X {
unsigned short a;
unsigned char b;
};
int main() {
constexpr std::array<X, 2> xs = { // C2078: too many initializers
{ 1, 2 },
{ 3, 4 }
};
return 0;
}
no Visual Studio 2017 versão 15,7 atualização 3 e posterior, o exemplo anterior agora gera C2078. O exemplo a
seguir mostra como corrigir o código. Ao inicializar um std::array com chaves init-lists aninhadas, forneça
para matriz interna uma lista entre chaves própria:
#include <array>
struct X {
unsigned short a;
unsigned char b;
};
int main() {
constexpr std::array<X, 2> xs = {{ // note double braces
{ 1, 2 },
{ 3, 4 }
}}; // note double braces
return 0;
}
Para corrigir o erro, altere o código da seguinte forma (com o atributo colocado antes de '=' da definição do
alias):
NOTE
nas versões do Boost. Python library anteriores a 1,70, há uma solução alternativa específica MSVC para uma declaração
de encaminhamento de modelo no unwind_type.hpp . em /permissive- modo começando no Visual Studio 2017
versão 15,8 ( _MSC_VER==1915 ), o compilador MSVC faz a pesquisa de nome dependente de argumento (ADL)
corretamente. Agora é consistente com outros compiladores, tornando essa proteção alternativa desnecessária. Para
evitar o erro C3861: 'unwind_type': identifier not found , atualize sua biblioteca Boost. Python.
O padrão C++ não permite que um usuário adicione declarações ou definições de encaminhamento no
namespace std . A adição de declarações ou de definições ao namespace std ou a um namespace no
namespace std agora resulta em um comportamento indefinido.
Em algum momento no futuro, a Microsoft mudará o local em que alguns tipos padrão são definidos. Essa
mudança interromperá o código existente que adiciona as declarações de encaminhamento ao namespace std .
Um novo aviso, o C4643, ajuda a identificar esses problemas de origem. O aviso é habilitado no /default
modo e é desativado por padrão. Ele afetará os programas que são compilados com o /Wall ou o /WX .
O código a seguir agora gera C4643:
namespace std {
template<typename T> class vector; // C4643: Forward declaring 'vector'
// in namespace std is not permitted
// by the C++ Standard`
}
Para corrigir o erro, use uma #include diretiva em vez de uma declaração de encaminhamento:
#include <vector>
class X {
public:
X(int, int);
X(int v) : X(v){} // C7535: 'X::X': delegating constructor calls itself
};
class X {
public:
X(int, int);
X(int v) : X(v, 0) {}
};
struct Data {
int x;
};
int main()
{
switch (0) {
case MY_OFFSET(Data, x): return 0; // C4644: usage of the
// macro-based offsetof pattern in constant expressions
// is non-standard; use offsetof defined in the C++
// standard library instead
// OR
// C2975: invalid template argument, expected
// compile-time constant expression
default: return 1;
}
}
Para corrigir o erro, use offsetof conforme definido por meio de <cstddef> :
#include <cstddef>
struct Data {
int x;
};
int main()
{
switch (0) {
case offsetof(Data, x): return 0;
default: return 1;
}
}
template<typename... T>
class X : public T... { };
class S { };
int main()
{
X<const S> x; // C3770: 'const S': is not a valid base class
}
template<typename T>
struct X : Base<T>
{
void example()
{
Base<T>::example<int>(); // C7510: 'example': use of dependent
// template name must be prefixed with 'template'
// note: see reference to class template instantiation
// 'X<T>' being compiled
}
};
template<typename T>
struct X : Base<T>
{
void example()
{
// Add template keyword here:
Base<T>::template example<int>();
}
};
A partir do C++17, os operandos dos operadores ->* , [] , >> e << devem ser avaliados na ordem da
esquerda para a direita. Há dois casos em que o compilador não conseguirá garantir esta ordem:
quando uma das expressões do operando é um objeto passado por valor ou que contém um objeto
passado por valor ou
Quando compilado usando /clr , e um dos operandos é um campo de um objeto ou um elemento de
matriz.
O compilador emite um aviso C4866 quando não é capaz de garantir a avaliação da esquerda para a direita. O
compilador gera esse aviso somente se /std:c++17 ou mais tarde for especificado, pois o requisito de ordem da
esquerda para a direita desses operadores foi introduzido em c++ 17.
Para resolver esse aviso, primeiro considere se a avaliação da esquerda para a direita dos operandos é
necessária. Por exemplo, pode ser necessário quando a avaliação dos operandos puder produzir efeitos
colaterais dependentes de ordem. A ordem na qual os operandos são avaliados não tem nenhum efeito
observável em muitos casos. Se a ordem da avaliação precisar ser da esquerda para a direita, considere se não é
possível passar os operandos por referência const. Essa alteração elimina o aviso no seguinte exemplo de
código:
// C4866.cpp
// compile with: /w14866 /std:c++17
class HasCopyConstructor
{
public:
int x;
HasCopyConstructor(int x) : x(x) {}
HasCopyConstructor(const HasCopyConstructor& h) : x(h.x) { }
};
int main()
{
HasCopyConstructor a{ 1 };
HasCopyConstructor b{ 2 };
private:
template <template <typename...> typename Type, typename... Args>
static constexpr A<Args...> from_template(A<Type<Args...>>);
};
A<>::from_template_t<A<int>> a;
O compilador também gera C7536 sempre que o .ifc arquivo tiver sido adulterado. O cabeçalho da interface
do módulo contém um hash SHA2 do conteúdo abaixo dele. Na importação, o .ifc arquivo é submetido a
hash e, em seguida, verificado em relação ao hash fornecido no cabeçalho. Se eles não corresponderem, o erro
C7536 será gerado:
#include <utility>
using size_t = std::size_t;
struct Alloc
{
static constexpr size_t size = 10;
};
int main()
{
A<void> a;
AlignedStorage<Alloc::size> buf;
if (f<Alloc>(a, buf) != 2)
{
return 1;
}
return 0;
}
A divergência de implementação se deve a uma regressão na expressão do padrão C++. A resolução para
edição de núcleo de 2235 removeu algum texto que permitiria que essas sobrecargas fossem ordenadas. O
padrão C++ atual não fornece um mecanismo para ordenar parcialmente essas funções, portanto, elas são
consideradas ambíguas.
Como solução alternativa, é recomendável não depender de ordenação parcial para resolver esse problema. Em
vez disso, use SFINAE para remover sobrecargas específicas. No exemplo a seguir, usamos uma classe auxiliar
IsA para remover a primeira sobrecarga quando Alloc é uma especialização de A :
#include <utility>
using size_t = std::size_t;
struct Alloc
{
static constexpr size_t size = 10;
};
int main()
{
A<void> a;
AlignedStorage<Alloc::size> buf;
if (f<Alloc>(a, buf) != 2)
{
return 1;
}
return 0;
}
void g();
template<typename T>
struct S
{
constexpr void f();
};
template<>
constexpr void S<int>::f()
{
g(); // C3615 in 15.9
}
Para evitar o erro, remova o constexpr qualificador da instanciação explícita da função f() .
Confira também
Conformidade da linguagem C/C++ da Microsoft
Conformidade da linguagem C/C++ da Microsoft
Visual Studio versão
03/07/2021 • 27 minutes to read
A conformidade com padrões para o compilador C/C++ da Microsoft Visual Studio (MSVC) é um trabalho em
andamento. Aqui está um resumo de nossa linguagem C e C++ Padrão ISO e conformidade com a biblioteca
por Visual Studio versão. Cada compilador C++ e o nome do recurso de biblioteca padrão são links para o
documento de proposta do ISO Standard C++ que descreve o recurso, se um estiver disponível no momento da
publicação. A coluna Com suporte lista a Visual Studio na 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 ver uma lista de outras alterações, confira Novidades do Visual 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 da falha do binário entre o Visual Studio 2015, Visual Studio 2017 e Visual Studio 2019. Para obter mais
informações, consulte Compatibilidade binária do C++ entre Visual Studio 2015, 2017 e 2019
VS 2017 15.3 17
P0028R4 Using attribute namespaces without
repetition
VS 2017 15.3 17
P0138R2 Direct-list-init of fixed enums from
integers
VS 2017 15.5 17
P0522R0 Matching template template-parameters to
compatible arguments
VS 2017 15.7 17
P0091R3 Template argument deduction for class
templates
P0512R0 Class template argument deduction issues
VS 2017 15.7 17
P0127R2 Declaring non-type template parameters with
auto
VS 2017 15.7 17
P0702R1 Fixing class template argument deduction
for initializer-list ctors
VS 2019 16.0 17
P0961R1 Relaxing the structured bindings
customization point finding rules
VS 2019 16.0 17
P0969R0 Allowing structured bindings to accessible
members
VS 2019 16.4 17
P1825R0 Merged wording for P0527R1 and P1155R3,
more implicit moves
VS 2019 16.5 17
P0962R1 Relaxing the range-for loop customization
point finding rules
VS 2015 14
P0641R2 const mismatch with defaulted copy
constructor
VS 2015 14
P0704R1 Fixing const lvalue ref-qualified pointers
to members
REC URSO C O M SUP O RT E
VS 2015 14
P1041R4 Make char16_t/char32_t string literals be
UTF-16/32
VS 2017 15.0 14
P1330R0 Changing the active member of a union
inside constexpr
VS 2017 15.7 14
P0972R0 noexcept For <chrono> zero(), min(), max()
VS 2019 16.0 20
P0515R3 Three-way (spaceship) comparison operator
<=>
VS 2019 16.0 20
P1008R1 Prohibiting aggregates with user-declared
constructors
VS 2019 16.1 20
P0846R0 ADL and function templates that are not
visible
VS 2019 16,2 20
P0428R2 Familiar template syntax for generic
lambdas
VS 2019 16,2 20
P0624R2 Default constructible and assignable
stateless lambdas
VS 2019 16,2 20
P0780R2 Allowing pack expansion in lambda init-
capture
VS 2019 16,2 20
P0806R2 Deprecate implicit capture of this via [=]
VS 2019 16,2 20
P1120R0 Consistency improvements for <=> and other
comparison operators
VS 2019 16,3 20
P1084R2 Today's return-type-requirements are
insufficient
VS 2019 16,4 20
P1091R3 Extending structured bindings to be more
like variable declarations
VS 2019 16,5 20
P0306R4 Adding __VA_OPT__ for comma omission and
comma deletion
VS 2019 16,5 20
P0683R1 Default member initializers for bit-fields
VS 2019 16,5 20
P1161R3 Deprecate uses of the comma operator in
subscripting expressions
VS 2019 16,5 20
P1703R1 Recognizing header unit imports requires
full preprocessing
VS 2019 16,6 14
P0692R1 Relaxing access checking on specializations
VS 2019 16,6 20
P0732R2 Class types in non-type template parameters
VS 2019 16,6 14
P1139R2 Address wording issues related to ISO 10646
VS 2019 16,6 20
P1907R1 Inconsistencies with non-type template
parameters
REC URSO C O M SUP O RT E
VS 2019 16,6 20
P1971R0 US053: Mandate the return type for
return_void and return_value to be void
VS 2019 16,6 20
P1971R0 US065: Apply Coroutines issue 24 from
P0664R8
VS 2019 16,7 20
P0388R4 Permit conversions to arrays of unknown
bound
VS 2019 16,7 20
P0466R5 Layout-compatibility and Pointer-
interconvertibility Traits
VS 2019 16,7 20
P0722R3 Efficient sized delete for variable sized
classes
VS 2019 16,7 20
P1331R2 Permitting trivial default initialization
in constexpr contexts
VS 2019 16,7 20
P1358R0 2310: Type completeness and derived-to-base
pointer conversions
VS 2019 16,7 20
P1452R2 On the non-uniform semantics of return-
type-requirements
VS 2019 16,7 20
P1616R1 Using unconstrained TTPs with constrained
templates
VS 2019 16,7 Dr
P1957R1 Converting from T* to bool should be
considered narrowing (re: US 212)
VS 2019 16,7 20
P1968R0 CWG 2282: Consistency with mismatched
aligned/non-over-aligned allocation/deallocation
functions
REC URSO C O M SUP O RT E
VS 2019 16,7 20
P1969R0 CWG 2280: Matching a usual deallocation
function with placement new
VS 2019 16,7 20
P1969R0 CWG 2382: Array allocation overhead for
non-allocating placement new
VS 2019 16,7 20
P1971R0 US052: Non-executed return statements in
coroutines
VS 2019 16,7 20
P1972R0 US105: Check satisfaction of constraints
for non-templates when forming pointer to function
VS 2019 16,7 20
P1980R0 CA096: Declaration matching for non-
dependent requires-clauses
VS 2019 16,7 20
P2103R0 US033: Allow "import" inside linkage-
specifications
VS 2019 16,7 20
P2107R0 US064: Copy semantics of coroutine
parameters
VS 2019 16,8 20
P0848R3 Conditionally trivial special member
functions
VS 2019 16,8 20
P0960R3 Allow initializing aggregates from a
parenthesized list of values
VS 2019 16,8 20
P1811R0 Relaxing redefinition restrictions for re-
exportation robustness
REC URSO C O M SUP O RT E
VS 2019 16,8 20
P1874R1 Dynamic Initialization Order of Non-Local
Variables in Modules
VS 2019 16,8 20
P1975R0 Fixing the wording of parenthesized
aggregate-initialization
VS 2019 16,9 20
P1064R0 Allowing virtual function calls in constant
expressions
VS 2019 16,9 20
P1141R2 Yet another approach for constrained
declarations
VS 2019 16,9 20
P1327R1 Allowing dynamic_cast, polymorphic typeid
in constant expressions
VS 2019 16,9 20
P1668R1 Permitting unevaluated inline assembly in
constexpr functions
N/D
P0735R1 Interaction of memory_order_consume with
release sequences
VS 2015
N3471 constexpr For <initializer_list>, <tuple>,
<utility>
VS 2015
N3642 UDLs For <chrono>, <string> (1729ms, "meow"s,
etc.)
VS 2015
N3669 Fixing constexpr Member Functions Without
const
VS 2015
N3671 Dual-Range equal(), is_permutation(),
mismatch()
VS 2015
N3891 Renaming shared_mutex (Timed) To
shared_timed_mutex
VS 2013
N3421 Transparent Operator Functors (less<>, etc.)
VS 2013
N3655 Alias Templates For <type_traits> (decay_t,
etc.)
VS 2015 F
N4190 Removing auto_ptr, random_shuffle(), And Old
<functional> Stuff
VS 2015 14
N4279 insert_or_assign()/try_emplace() For
map/unordered_map
VS 2015 14
N4366 Precisely Constraining unique_ptr Assignment
VS 2013 14
N4510 Supporting Incomplete Types In
vector/list/forward_list
VS 2015.2 14
P0006R0 Variable Templates For Type Traits
(is_same_v, etc.)
VS 2015.2 14
P0013R1 Logical Operator Type Traits (conjunction,
etc.)
VS 2017 15.3 17
P0031R0 constexpr For <array> (Again) And
<iterator>
VS 2017 15.0
P0032R3 Homogeneous Interface For
variant/any/optional
VS 2017 15.3 17
P0154R1 hardware_destructive_interference_size,
etc.
VS 2017 15.3 17
P0156R2 Renaming Variadic lock_guard to scoped_lock
VS 2017 15.5 17
P0302R1 Removing Allocator Support In std::function
VS 2017 15.3 14
P0418R2 atomic compare_exchange memory_order
Requirements
VS 2017 15.7
P0433R2 Integrating template deduction for class
templates into the standard library
VS 2017 15.0
P0504R0 Revisiting
in_place_t/in_place_type_t<T>/in_place_index_t<I>
VS 2017 15.0
P0510R0 Rejecting variants Of Nothing, Arrays,
References, And Incomplete Types
VS 2017 15.3 14
P0517R0 Constructing future_error From future_errc
VS 2017 15.3 14
P0558R1 Resolving atomic<T> Named Base Class
Inconsistencies
VS 2017 15.317
P0602R4 Propagating Copy/Move Triviality In
variant/optional
VS 2017 15.3 17
P0604R0 Changing is_callable/result_of To
invoke_result, is_invocable, is_nothrow_invocable
VS 2019 16.1 20
P0457R2 starts_with()/ends_with() For
basic_string/basic_string_view
VS 2019 16.1 20
P0458R2 contains() For Ordered And Unordered
Associative Containers
VS 2019 16.1 20
P0646R1 list/forward_list
remove()/remove_if()/unique() Return size_type
VS 2019 16.2 20
P0020R6 atomic<float>, atomic<double>, atomic<long
double>
VS 2019 16.2 20
P0482R6 char8_t: A type for UTF-8 characters and
strings
VS 2019 16.2 20
P0771R1 noexcept For std::function's Move
Constructor
VS 2019 16.3 20
P0919R3 Heterogeneous Lookup For Unordered
Containers
VS 2019 16.5 20
P0556R3 <bit> ispow2(), ceil2(), floor2(), log2p1()
VS 2019 16.5 20
P1227R2 Signed std::ssize(), Unsigned span::size()
VS 2019 16.5 20
P1651R0 bind_front() Should Not Unwrap
reference_wrapper
VS 2019 16.5 20
P1690R1 Refining Heterogeneous Lookup For Unordered
Containers
VS 2019 16.6 20
P0357R3 Supporting Incomplete Types In
reference_wrapper
VS 2019 16.6 20
P0619R4 Removing C++17-Deprecated Features In C++20
VS 2019 16.6 14
P0935R0 Eradicating Unnecessarily Explicit Default
Constructors
VS 2019 16.6 20
P1006R1 constexpr For
pointer_traits<T*>::pointer_to()
VS 2019 16.6 14
P1165R1 Consistently Propagating Stateful
Allocators In basic_string's operator+()
VS 2019 16.6 20
P1423R3 char8_t backward compatibility remediation
VS 2019 16.7 20
P0528R3 Atomic Compare-And-Exchange With Padding
Bits
VS 2019 16.7 20
P0718R2 atomic<shared_ptr<T>>, atomic<weak_ptr<T>>
VS 2019 16.7 20
P1831R1 Deprecating volatile in the standard
library
VS 2019 16.7 20
P1871R1 Concept traits should be named after
concepts
VS 2019 16.7 20
P1956R1 <bit> has_single_bit(), bit_ceil(),
bit_floor(), bit_width()
VS 2019 16.7 20
P1976R2 Fixed-size span construction from dynamic
range
REC URSO C O M SUP O RT E
VS 2019 16.7 20
P2102R0 Make "implicit expression variations" more
explicit
VS 2019 16.7 20
P2116R0 Remove tuple-like protocol support from
fixed-extent span
VS 2019 16.8 20
P0528R3 Library support for atomic compare-and-
exchange with padding bits
VS 2019 16.8 20
P1123R0 Editorial Guidance for merging P0019r8 and
P0528r3
VS 2019 16.9 20
P0768R1 Library Support For The Spaceship
Comparison Operator <=>
VS 2019 16.9 20
P1020R1 Smart Pointer Creation With Default
Initialization
VS 2019 16.9 20
P1771R1 Library support for [[nodiscard]] for
constructors
REC URSO C O M SUP O RT E
VS 2019 16.10 20
P0408R7 Efficient access To basic_stringbuf's
buffer
VS 2019 16.10 20
P0466R5 Library support for layout-compatibility
and pointer-interconvertibility traits
VS 2019 16.10 20
P0475R1 Guaranteed Copy Elision For Piecewise
Construction
VS 2019 16.10 20
P0591R4 Utility Functions For Uses-Allocator
Construction
VS 2019 16.10 20
P0608R3 Improving variant's Converting
Constructor/Assignment
VS 2019 16.10 20
P0784R7 Library support for more constexpr
containers
N/D
P1285R0 Improving Completeness Requirements For
Type Traits
Não
P1679R3 contains() For
basic_string/basic_string_view
Um grupo de documentos listados em conjunto indica um recurso padrão junto com uma ou mais melhorias ou
expansões aprovadas. Esses recursos são implementados juntos.
aligned_alloc Sem M
A biblioteca de algoritmos paralelos do G C++17 está concluída. Concluído não significa que cada algoritmo é
paralelizado em todos os casos. Os algoritmos mais importantes foram paralelizados e as assinaturas de política
de execução são fornecidas mesmo quando não paralelizamos algoritmos. O header interno central da nossa
implementação, , contém as seguintes "Notas de Algoritmos Paralelos": O C++ permite que uma
implementação implemente algoritmos paralelos como chamadas para os <yvals_core.h> 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 , count ,
, equal , exclusive_scan , find ,
count_if
find_end , find_first_of , find_if , find_if_not , for_each , for_each_n , inclusive_scan , is_heap ,
is_heap_until , is_partitioned , is_sorted , is_sorted_until , mismatch , none_of , partition , reduce ,
remove , remove_if , replace , replace_if , search , search_n , set_difference , set_intersection , sort ,
stable_sort , transform , transform_exclusive_scan , transform_inclusive_scan , transform_reduce
H Essa é uma implementação totalmente nova, incompatível com a versão anterior, necessária para o suporte a
symlink, correções de bugs e alterações no comportamento std::experimental exigido pelo padrão.
Atualmente, <filesystem> fornece o novo std::filesystem e o std::experimental::filesystem anterior. O
<experimental/filesystem> header fornece apenas a implementação experimental antiga. A implementação
experimental será removida na próxima versão de quebra de ABI das bibliotecas.
Eu suportei por um intrínseco do compilador.
O J é habilitado pelo ou posterior, mas como ele pode entrar em conflito com os Windows std::byte SDK em
alguns casos, ele tem uma macro de aceitação /std:c++17 fina. Para desabilitá-lo, defina _HAS_STD_BYTE como
0 .
K MSVC não dá suporte à _Complex palavra-chave 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 os modificadores de conversão strftime E alternativa e O . Esses
modificadores são ignorados (por exemplo, %Oe comporta-se da mesma forma que %e ). Não há suporte para
os modificadores nas APIs de localidade subjacentes.
M O CRT Universal não implementa C11, aligned_alloc mas fornece e _aligned_malloc _aligned_free . Como
o Windows sistema operacional 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 backward.
O Determinadas 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 são simplificadas: 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 padrão: clearerr_s , fread_s .
14 Esses recursos do C++17 e do C++20 estão sempre habilitados, mesmo quando /std:c++14 (o padrão) é
especificado. O motivo é porque o recurso foi implementado antes da introdução das opções ou porque a
implementação condicional era /std indevidamente complexa.
17 Esses recursos são habilitados pela opção /std:c++17 do compilador (ou /std:c++latest ).
20 Em versões Visual Studio 2019 versão 16.10, esses recursos são habilitados pela opção /std:c++latest do
compilador. Quando a implementação do C++20 for concluída, adicionaremos uma nova opção /std:c++20 de
compilador para habilitar esses recursos.
DR Esses recursos estão habilitados em todos os modos de opção /std do compilador C++. O comitê C++
Standard aprovou essa alteração como um Relatório de Defeito retroativo para C++11 e todas as versões
posteriores.
C11 O suporte do compilador para C11 e C17 requer Visual Studio 2019 versão 16.8 ou superior. Com exceção
do que foi marcado, o suporte à biblioteca C11 e C17 requer Windows 10 build do SDK 10.0.20211.0 ou
superior. Para obter mais informações sobre como instalar o suporte para C11 e C17, consulte Install C11 and
C17 support in Visual Studio.
O suporte à biblioteca 2104 C11 para esse recurso requer Windows 10 build do SDK 10.0.20348.0 (versão
2104) ou superior.
Confira também
Referência da linguagem C++
Biblioteca Padrão do C++
Melhorias de conformidade do C++ Visual Studio
Novidades do Visual C++ em Visual Studio
Visual C++ histórico de alterações de 2003 a 2015
Visual C++ novidades de 2003 a 2015
Blog da equipe do C++
Plataformas com suporte (Visual C++)
13/05/2021 • 2 minutes to read
Os aplicativos criados com o Visual Studio podem ser direcionados a várias plataformas, como as seguintes.
SIST EM A
O P ERA C IO N A L X86 X64 A RM A RM 64****
Windows XP X* X*
Windows Server X* X*
2003
Windows Vista X X
Windows Server X X
2008
Windows 7 X X
Windows Server X X
2012 R2
Windows 8 X X X
Windows 8.1 X X X
Windows 10 X X X X
Android ** X X X X
iOS ** X X X X
Linux *** X X X X
* Você pode usar o conjunto de ferramentas da plataforma Windows XP incluído no Visual Studio 2017, no
Visual Studio 2015, no Visual Studio 2013 e no Visual Studio 2012 atualização 1 para compilar projetos do
Windows XP e do Windows Server 2003. Para obter informações sobre como usar esse conjunto de
ferramentas da plataforma, consulte Configuring Programs for Windows XP (Configurando programas para
Windows XP). Para obter mais informações sobre como alterar o conjunto de ferramentas da plataforma,
consulte Como modificar a estrutura de destino e o conjunto de ferramentas da plataforma.
** É possível instalar a carga de trabalho Desenvolvimento Móvel com C++ no instalador do Visual Studio
2017 e posterior. Na instalação do Visual Studio 2015, escolha o componente opcional Visual C++ para
Desenvolvimento Móvel da Plataforma Cruzada para direcionar plataformas iOS ou Android. Para obter
mais informações, consulte Instalar o Visual C++ para Desenvolvimento Móvel da Plataforma Cruzada. Para
compilar o código do iOS, é necessário ter um computador Mac e atender a outros requisitos. Para obter uma
lista de pré-requisitos e instruções de instalação, consulte Instalar e configurar ferramentas de build usando o
iOS. É possível compilar código x86 ou ARM para coincidir com o hardware de destino. Use configurações x86
para compilar no simulador de iOS, no Emulador do Microsoft Visual Studio para Android e em alguns
dispositivos Android. Use configurações ARM para compilar em dispositivos iOS e na maioria dos dispositivos
Android.
*** É possível instalar a carga de trabalho Desenvolvimento para Linux com C++ no instalador do Visual
Studio 2017 e posterior para direcionar plataformas Linux. Para obter instruções, consulte Baixar, instalar e
configurar a carga de trabalho do Linux. Esse conjunto de ferramentas compila o executável no computador de
destino, permitindo builds para qualquer arquitetura com suporte.
**** O suporte a ARM64 está disponível no Visual Studio 2017 e posterior.
Para obter informações de como definir a configuração da plataforma de destino, consulte Baixar, instalar e
configurar a carga de trabalho do Linux (Como configurar projetos do Visual C++ para plataformas x64 de 64
bits de destino).
Veja também
Ferramentas e recursos do Visual C++ em edições do Visual Studio
Introdução
Ferramentas e funcionalidades do C++ em edições
do Visual Studio
13/05/2021 • 10 minutes to read
Os recursos do C++ a seguir estão disponíveis no Visual Studio 2019. A menos que declarado de outra forma,
todos os recursos estão disponíveis em todas as edições: Visual Studio Community, Visual Studio Professional e
Visual Studio Enterprise. Alguns recursos exigem cargas de trabalho específicas ou componentes opcionais, que
você pode instalar com o Instalador do Visual Studio.
Plataformas
Windows Desktop
Plataforma Universal do Windows ((tablet, computador, Xbox, IoT e HoloLens))
Linux
Android
iOS
Compiladores
Compilador MSVC de 32 bits para x86, x64, ARM e ARM64
Compilador MSVC de 64 bits para x86, x64, ARM e ARM64
Compilador cruzado GCC para ARM
Clang/LLVM
No Windows, Clang/LLVM 7.0, direcionando x86 ou x64 (somente suporte a CMake). Outras versões
do Clang poderiam funcionar, mas não há suporte oficial para elas.
No Linux, há suporte a qualquer instalação do Clang/LLVM pela distribuição.
Componentes individuais
É possível instalar esses componentes independentemente de qualquer carga de trabalho.
Diagnóstico do JavaScript
Live Share
runtime da Plataforma Universal do Windows do C++ para ferramentas de build v142
Publicação ClickOnce
Projetos do Instalador do Microsoft Visual Studio
Bibliotecas e cabeçalhos
Cabeçalhos e bibliotecas do Windows
CRT (Runtime C) Universal do Windows
Biblioteca Padrão C++
ATL
MFC
Biblioteca de classes .NET Framework
Biblioteca de suporte do C++ para .NET
OpenMP 2.0
Mais de 900 bibliotecas open-source por meio do catálogo de vcpkg
Modelos de projeto
Os seguintes modelos de projeto estão disponíveis dependendo de quais cargas de trabalho você instalou.
Área de trabalho do Windows:
Projeto em branco
Aplicativo de Console
Assistente de Área de Trabalho do Windows
Aplicativos da Área de Trabalho do Windows
Projeto Itens Compartilhados
Aplicativo do MFC
Biblioteca de vínculo dinâmico
Projeto CLR Vazio
Aplicativo de console do CLR
Biblioteca Estática
Projeto do CMake
Projeto ATL
Biblioteca de vínculo dinâmico do MFC
Biblioteca de classes do CLR
Projeto Makefile (Windows)
ActiveXControl do MFC
Projeto de Teste da Unidade Nativa
Google Test
Plataforma Universal do Windows (C++/CX):
Aplicativo em branco
Aplicativo DirectX 11 e XAML
Aplicativo DirectX 11
Aplicativo DirectX 12
Aplicativo de Teste de Unidade
DLL
componente do Windows Runtime
Biblioteca Estática
Projeto de Empacotamento de Aplicativo do Windows
Linux:
Aplicativo de console (Linux)
Projeto vazio (Linux)
Raspberry Pi Blink
Projeto Makefile (Linux)
Ferramentas
Vinculador Incremental (Link.exe)
Utilitário do Microsoft Makefile (Nmake.exe)
Gerador de Lib (Lib.exe)
Compilador de Recurso do Windows (Rc.exe)
Recurso do Windows para Conversor de Objeto (CvtRes.exe)
Utilitário de Manutenção de Informações de Procura (BscMake.exe)
Removedor de Decoração de Nomes do C++ (Undname.exe)
Despejo de COFF/PE (Dumpbin.exe)
Editor de COFF/PE (Editbin.exe)
MASM (Ml.exe)
Spy++
ErrLook
AtlTrace
Regras de inferência
Otimizações guiadas por perfil
Funcionalidades de depuração
Depuração nativa
natvis (visualização nativa de tipo)
Depuração de gráficos
Depuração gerenciada
Uso de GPU
Uso de memória
Depuração remota
Depuração SQL
Análise de código estático
Designers e Editores
XAML Designer
Designer/Editor de Estilo CSS
Designer/Editor de HTML
Editor de XML
Editor de Código-fonte
Recursos de produtividade: refatoração, mecanismo IntelliSense EDG, formatação de código C++
Designer de Formulários do Windows
Designer de dados
Editor de Recurso Nativo (arquivos .rc)
Editores de recursos
Editor de modelos
Designer de sombreador
Validação de dependência dinâmica (somente Enterprise)
Diagramas de camada de arquitetura (somente Enterprise)
Validação de arquitetura (somente Enterprise)
Clone de código (somente Enterprise)
Funcionalidades de dados
Designer de dados
Objetos de dados
Serviços Web
Gerenciador de Servidores
Automação e extensibilidade
Modelos de objeto de extensibilidade
Modelo de código
Modelo de Projeto
Modelo de editor de recursos
Modelo de assistente
Modelo de objeto do depurador
Veja também
Instalar o Visual Studio
O que há de novo no Visual Studio
Tipos de projeto do C++ no Visual Studio
As tabelas a seguir mostram os recursos do Visual C++ disponíveis no Visual Studio 2017. Um X em uma célula
indica que o recurso está disponível; uma célula vazia indica que o recurso não está disponível. As observações
entre parênteses indicam que um recurso está disponível, mas é restrito.
Plataformas
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA C O M M UN IT Y / P RO F E VISUA L ST UDIO
P L ATA F O RM A W IN DO W S 10 W IN DO W S DESK TO P SSIO N A L EN T ERP RISE
Windows Desktop X X X
Plataforma Universal X X X
do Windows
(telefone, tablet,
computador, Xbox,
IoT e HoloLens)
Linux X X
Android X X
iOS X X
Compiladores
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
C O M P IL A DO R W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Compilador MSVC X X X X
X86 de 32 bits
Compilador cruzado X X X
X86_arm
Compilador MSVC X X
x64 de 64 bits
Compilador cruzado X X X X
X86_ x64
Bibliotecas e cabeçalhos
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
B IB L IOT EC A O U EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
C A B EÇ A L H O W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Cabeçalhos e (X) X X X
bibliotecas do
Windows e biblioteca
CRT
Biblioteca Padrão X X X X
C++
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
B IB L IOT EC A O U EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
C A B EÇ A L H O W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
ATL X X
MFC X X
Biblioteca de classes X X X
.NET Framework
Biblioteca de suporte X X X
do C++ para .NET
OpenMP 2.0 X X X X
Modelos de projeto
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
M O DELO W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Aplicativo Direct3D X X X
DLL (Universal do X X X
Windows)
Biblioteca Estática X X X
(Universal do
Windows)
componente do X X X
Windows Runtime
Aplicativo de Teste de X X X
Unidade (Universal
do Windows)
Projeto ATL X X
Biblioteca de Classes X X X
(CLR)
Aplicativo de Console X X X
CLR
Assistente X X
personalizado
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
M O DELO W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Projeto em branco X X X
Projeto Makefile X X X
Controle ActiveX do X X
MFC
Aplicativo MFC X X
DLL do MFC X X
Projeto de Teste X X X X
Aplicativo de Console X X X
Win32
Projeto Win32 X X X
Ferramentas
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
F ERRA M EN TA W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Vinculador X X X X
Incremental
(Link.exe)
Utilitário de X X X
Manutenção de
Programas
(Nmake.exe)
Gerador de Lib X X X X
(Lib.exe)
Compilador de X X X X
Recurso do Windows
(Rc.exe)
Recurso do Windows X X X
para Conversor de
Objeto (CvtRes.exe)
Utilitário de X X X X
Manutenção de
Informações de
Procura
(BscMake.exe)
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
F ERRA M EN TA W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Removedor de X X X X
Decoração de Nomes
do C++
(Undname.exe)
Despejo de COFF/PE X X X X
(Dumpbin.exe)
Editor de COFF/PE X X X X
(Editbin.exe)
MASM (Ml.exe) X X
Spy++ X X
ErrLook X X
AtlTrace X X
Devenv.com X X
Regras de inferência X X
Atualizar projetos X X X X
.vcproj do VCBuild
para o MSBuild
(VCUpgrade.exe)
Otimizações guiadas X X
por perfil
Funcionalidades de depuração
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
REC URSO DE EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
DEP URA Ç Ã O W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Depuração nativa X X X X
natvis (visualização X X X X
nativa de tipo)
Depuração de X X X
gráficos
Depuração X X X
gerenciada
Uso de GPU X X X
Uso de memória X X X
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
REC URSO DE EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
DEP URA Ç Ã O W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Depuração remota X X X X
Depuração SQL X X
Designers e Editores
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
DESIGN ER O U EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
EDITO R W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
XAML Designer X X X
Designer/Editor de X X X X
Estilo CSS
Designer/Editor de X X X X
HTML
Editor de XML X X X X
Editor de Código- X X X X
fonte
Funcionalidades de X X X X
produtividade:
Refatoração,
IntelliSense,
Formatação de
Código C++
Designer de X X X
Formulários do
Windows
Designer de dados X X
Editor de Recurso X X
Nativo (arquivos .rc)
Editores de recursos X X X X
Editor de modelos X X X
Designer de X X X
sombreador
Funcionalidades de dados
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
REC URSO DE DA DO S W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Designer de dados X X
Objetos de dados X X
Serviços Web X X
Gerenciador de X X
Servidores
Builds de linha de X X X X
comando
(msbuild.exe)
Multiplataforma X X X
nativa
Multiplataforma X X X
gerenciada
Builds paralelos X X X X
Personalizações de X X X X
build
Extensibilidade de X X X X
páginas de
propriedades
Automação e extensibilidade
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
A UTO M A Ç Ã O E EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
EXT EN SIB IL IDA DE W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Modelos de objeto X X
de extensibilidade
Modelo de código X X
Modelo de Projeto X X
Modelo de editor de X X
recursos
Modelo de assistente X X
VISUA L ST UDIO VISUA L ST UDIO VISUA L ST UDIO
A UTO M A Ç Ã O E EXP RESS PA RA EXP RESS PA RA P RO F ESSIO N A L / C O M VISUA L ST UDIO
EXT EN SIB IL IDA DE W IN DO W S W IN DO W S DESK TO P M UN IT Y EN T ERP RISE
Modelo de objeto do X X
depurador
Teste de unidade X X X X
(estrutura nativa)
Teste de unidade X X X
(estrutura
gerenciada)
Cobertura de código X
Teste manual X
Teste exploratório X
Gerenciamento de X
casos de teste
Depuração do mapa X
de códigos
Veja também
Instalar o Visual Studio
O que há de novo no Visual Studio
Tipos de projeto do C++ no Visual Studio
Instalar o suporte C11 e C17 no Visual Studio
03/07/2021 • 3 minutes to read
O suporte para padrões C11 e C17 requer Visual Studio 2019 versão 16.8 ou posterior. Para ver a
documentação desta versão, de definido o controle Visual Studio seletor de versão do Visual Studio 2019. Ele é
encontrado na parte superior do conteúdo desta página.
O suporte para padrões C11 e C17 está disponível a partir do Visual Studio 2019 versão 16.8. O suporte requer
um UCRT (Universal C Runtime) atualizado e as atualizações mais recentes do SDK do Windows, para funcionar
corretamente com o pré-processador compatível ( /Zc:preprocessor ).
Windows As versões do SDK correspondem Windows versões do sistema operacional. O suporte a C11 e C17
requer Windows SDK 10.0.20348.0 (versão 2104) ou posterior. Normalmente, o Windows SDK é uma opção
instalável na guia Componentes Individuais no Instalador do Visual Studio. Essa é a maneira recomendada de
atualizar o SDK para uso com Visual Studio. No entanto, no momento da redação, Windows SDK mais recente
não está disponível no Instalador do Visual Studio. Você pode seguir estas etapas para configurar o SDK mais
recente e criar o código C11 ou C17 no Visual Studio ou na linha de comando.
Pré-requisitos
Visual Studio 2019 versão 16.8 ou posterior instalada e em execução no computador. Recomendamos que
você use a versão mais recente disponível para o melhor suporte. Se Visual Studio ainda não estiver
instalado, confira Instalar o suporte ao C++ no Visual Studio para obter instruções de instalação. Na
instalação, inclua a carga de trabalho Desenvolvimento para desktop com C++.
Escolha Instalar para instalar os componentes selecionados do SDK. O SDK leva alguns minutos para concluir a
instalação. Quando ele for concluído, abra Visual Studio.
Confira também
/std (Especificar a versão padrão do idioma)
Amostras do Visual Studio C++
13/05/2021 • 56 minutes to read
Exemplos para o Visual Studio C++ estão disponíveis na Web. A Microsoft produziu muitos exemplos de C++
que demonstram funcionalidades diferentes em várias tecnologias. Aqui estão alguns dos locais para encontrar
exemplos adicionais:
Exemplos de Microsoft Docs-C++
Exemplos do Windows no GitHub
Exemplos de código do centro de desenvolvimento do Windows
Arquivo de exemplo do CodePlex
Exemplos de código do ADO
Exemplos de desenvolvimento de hardware para Windows
IMPORTANT
Este código de exemplo destina-se a ilustrar um conceito e mostra somente o código que é relevante para esse conceito.
Ele pode não atender aos requisitos de segurança de um ambiente específico e não deve ser usado exatamente como
mostrado. Recomendamos que você adicione código de segurança e tratamento de erros para tornar seus projetos tão
seguros e robustos quanto for conveniente. A Microsoft fornece esse código de exemplo "como está", sem garantias.
Exemplos de ATL
Exemplos de ATL -avançado
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos de ComTypeLibfor7
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos de compilador
Exemplos de compilador-geral
N O M E DA A M O ST RA DESC RIÇ Ã O
Amostras de CRT
N O M E DA A M O ST RA DESC RIÇ Ã O
Amostras de depuração
N O M E DA A M O ST RA DESC RIÇ Ã O
Amostras de fusão
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de Hilo
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos internacionais
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos de linguagem-geral
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos de MFC
Exemplos de MFC – avançado
N O M E DA A M O ST RA DESC RIÇ Ã O
Sem janela restrita Demonstra o uso de um CDialog objeto MFC como uma
caixa de diálogo sem janela restrita.
Exemplos de ODBC
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos de so
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos de UNIX
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplos do Windows 8
O pacote de exemplo do Windows 8 inclui todos os exemplos de código do aplicativo desenvolvidos e
atualizados para o Windows 8. O pacote de exemplo fornece uma maneira conveniente de baixar todos os
exemplos de uma só vez. Os exemplos neste pacote de exemplo estão disponíveis em C#, C++, VB.NET e
JavaScript. A Galeria de exemplos do Windows contém exemplos de código que exercitam os vários novos
modelos de programação, plataformas, recursos e componentes disponíveis no Windows 8 e no Windows
Server 2012. Esses exemplos baixáveis contêm o arquivo da solução do Visual Studio (sln), os arquivos de
origem, os ativos, os recursos e os metadados necessários para compilar e executar com êxito.
Mais informações estão disponíveis sobre os modelos de programação, plataformas, linguagens e APIs
demonstrados em cada exemplo. Consulte a orientação, os tutoriais e os artigos de referência fornecidos na
documentação do Windows 8, disponível na central de desenvolvedores do Windows. Esses exemplos são
fornecidos no estado em que se encontram, para demonstrar a funcionalidade dos modelos de programação e
APIs de recursos para o Windows 8 e o Windows Server 2012.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de transferência em segundo plano (Windows 8) Este exemplo demonstra o comportamento amigável, com
reconhecimento de custos e flexível da API de transferência
em segundo plano para aplicativos Windows Runtime. Os
cenários de exemplo fornecidos abrangem downloads de
arquivos e uploads.
Exemplo de CryptoWinRT (Windows 8) Este exemplo mostra como usar as novas APIs de
criptografia.
Exemplo de impressão (Windows 8) Este exemplo demonstra como os aplicativos podem integrar
a experiência de impressão do Windows. Os cenários
demonstrados neste exemplo incluem: impressão do
aplicativo usando a barra de botões e o contrato de
impressão, impressão de dentro da experiência do aplicativo
e muito mais.
Exemplo de nome de imagem da conta (Windows 8) Este exemplo demonstra diferentes maneiras de obter o
nome do usuário que está conectado no momento. Ele
também demonstra como obter e definir a imagem usada
para o bloco do usuário.
Exemplo de configurações de aplicativo (Windows 8) Este exemplo demonstra como usar os submenus API
ApplicationSettings e configurações para integrar a interface
do usuário de configurações do aplicativo com o botão
Configurações. O exemplo usa o
Windows.UI.ApplicationSettings namespace e
WinJS.UI.SettingsFlyout .
Aplicativo de dispositivo da Windows Store para exemplo de Este exemplo demonstra como criar um aplicativo de
câmera (Windows 8) dispositivo da Windows Store para uma câmera. Um
aplicativo de dispositivo da Windows Store é fornecido por
um IHV ou OEM para diferenciar a experiência de captura de
uma câmera específica.
N O M E DA A M O ST RA DESC RIÇ Ã O
Introdução ao exemplo de leitor de blog simples do C++ O exemplo demonstra alguns princípios básicos do
(Windows 8) desenvolvimento de aplicativos da Windows Store em C++
nativo usando XAML para definir a interface do usuário. É
uma versão de trabalho completa do aplicativo abordada no
Windows Developer Center.
Exemplo de leitura e gravação de dados (Windows 8) Este exemplo mostra como usar as classes DataReader e
DataWriter para armazenar e recuperar dados.
Exemplo de dados de aplicativo (Windows 8) Este exemplo mostra como armazenar e recuperar dados
que são específicos de cada usuário e aplicativo da Windows
Store usando as APIs de dados do aplicativo Windows
Runtime. Os dados do aplicativo incluem estado de sessão,
preferências do usuário e outras configurações.
Exemplo de acesso de driver personalizado (Windows 8) Este exemplo mostra como usar CreateDeviceAccessInstance
e IDeviceIoControl para acessar um dispositivo especializado.
Exemplo de ListView e GridView Essentials do XAML Este exemplo demonstra como usar os controles GridView e
(Windows 8) ListView.
Exemplo de métricas de animação (Windows 8) Este exemplo mostra como usar as APIs de métricas de
animação no Windows.UI.Core.AnimationMetrics para
acessar os parâmetros brutos que definem as animações na
biblioteca de animações do Windows.
Amostra de jogo de captura XAML DirectX 3D (Windows 8) Este exemplo demonstra a implementação de um jogo
simples de primeira pessoa 3-D usando DirectX (Direct3D
11,1, Direct2D, XInput e XAudio2) e XAML em um aplicativo
C++. O XAML é usado para a exibição de cabeçotes e as
mensagens de estado do jogo.
Exemplo de rolagem, panorâmica e zoom do XAML Este exemplo demonstra como usar o controle ScrollViewer
(Windows 8) para panorâmica e zoom.
Exemplo de controle FlipView XAML (Windows 8) Este exemplo demonstra como usar o controle FlipView para
permitir que os usuários percorram uma coleção.
Exemplo de SDK do aplicativo de dispositivo para Este exemplo mostra como criar um aplicativo de dispositivo
impressoras (Windows 8) para impressoras que podem ser ativadas no contrato de
bloco, o contrato printTaskSettings e do sistema de
notificação exibido por backgroundTask em resposta ao
evento de driver de impressão.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de tarefa em segundo plano (Windows 8) Este exemplo mostra como criar e registrar tarefas em
segundo plano usando o Windows Runtime API de tarefa
em segundo plano. Uma tarefa em segundo plano é
disparada por um evento de sistema ou hora e pode ser
restrita por uma ou mais condições.
Exemplo de notificações agendadas (Windows 8) Este exemplo mostra como usar atualizações de bloco
agendadas e recorrentes e notificações do sistema para um
aplicativo. Essa capacidade permite que você especifique um
tempo preciso para entregar a notificação, mesmo que o
aplicativo não esteja em execução.
Exemplo complementar do Gerenciador de reprodução Este exemplo demonstra como selecionar a categoria de
(Windows 8) msAudioCategory correta para um fluxo de vídeo de áudio
para configurá-lo como um fluxo de reprodução de áudio.
Exemplo de acesso a arquivos (Windows 8) Este exemplo mostra como criar, ler, gravar, copiar e excluir
um arquivo, como recuperar propriedades de arquivo e
como rastrear um arquivo ou pasta para que seu aplicativo
possa acessá-lo novamente. Este exemplo usa
Windows.Storage Windows.Storage.AccessCache API e.
Amostra XAML SurfaceImageSource DirectX Interop Este exemplo demonstra como usar um
(Windows 8) SurfaceImageSource para incluir conteúdo do DirectX em
seu aplicativo XAML. Este exemplo usa C++ e C#.
Exemplo de conexão com WebSockets (Windows 8) Este exemplo demonstra como usar Websockets em um
aplicativo da Windows Store conectado. O exemplo aborda a
funcionalidade básica, como fazer uma conexão, enviar e
receber dados e fechar a conexão.
Configurar chaves para o exemplo de mídia (Windows 8) Este exemplo demonstra como configurar as chaves de mídia
de hardware em um teclado. Em seguida, como usar as
chaves configuradas para controlar um fluxo de vídeo de
áudio pressionando ou clicando em reproduzir, pausar, parar
e assim por diante.
N O M E DA A M O ST RA DESC RIÇ Ã O
Amostra de animações de personalidade XAML (Windows 8) Este exemplo demonstra como usar as animações de
personalidade internas em seu aplicativo.
Exemplo de notificações do sistema (Windows 8) Este exemplo mostra como usar notificações do sistema:
aquelas que aparecem como pop-up notificações no canto
superior direito da tela. Um usuário pode selecionar o
sistema de notificação (toque ou clique) para iniciar o
aplicativo associado.
Exemplo de aplicativo de seletor de contato (Windows 8) Este exemplo demonstra como usar o seletor de contatos
para selecionar um ou mais contatos. Ele também inclui uma
implementação básica das APIs de seletor de contato para
demonstrar como exibir uma lista de contatos para o
usuário.
Exemplo de jogo de labirinto de mármore DirectX (Windows Este exemplo demonstra como criar um jogo 3D básico
8) usando o DirectX. Esse jogo é um jogo simples de labirinto
em que o jogador é desafiador a lançar uma mármore por
meio de um labirinto de armadilhas usando controles de
inclinação.
Exemplo de aplicativo de cartão postal DirectX (Windows 8) Este exemplo demonstra a implementação de um aplicativo
simples da Windows Store usando o DirectX com C++ para
a criação de cartão postal usando DirectX e
interoperabilidade XAML.
Exemplo de jogo de captura do DirectX 3D (Windows 8) Este exemplo demonstra a implementação de um jogo
simples de primeira pessoa 3-D usando DirectX (Direct3D
11,1, Direct2D, XInput e XAudio2) em um aplicativo C++.
Exemplo de controle AppBar XAML (Windows 8) Este exemplo demonstra como usar o controle AppBar para
apresentar navegação, comandos e ferramentas aos
usuários. A barra de aplicativos fica oculta por padrão e
aparece quando os usuários passam um dedo da borda
superior ou inferior da tela.
Exemplo de formatação de data e hora (Windows 8) Este exemplo demonstra como usar a classe
DateTimeFormatter no
Windows.Globalization.DateTimeFormatting namespace
para exibir datas e horas de acordo com as preferências do
usuário.
Exemplo de blocos secundários (Windows 8) Este exemplo mostra como fixar e usar um bloco secundário.
Esse é um bloco que acessa diretamente uma seção
específica, não padrão ou uma experiência dentro de um
aplicativo, como um jogo salvo ou um amigo específico em
um aplicativo de rede social.
Exemplo de teste de inserção de toque de entrada (Windows Este exemplo usa um quebra-cabeça de formas de polígono
8) para demonstrar como tratar a entrada do ponteiro,
implementar testes de clique personalizados para entrada
por toque e manipulações de processo em um aplicativo da
Windows Store usando C++ e DirectX.
Exemplo de informações de rede (Windows 8) Este exemplo demonstra como usar as APIs de informações
de rede Windows Runtime.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de entrada de tinta simplificada (Windows 8) Este exemplo demonstra como usar a funcionalidade de tinta
nos aplicativos da Windows Store.
Exemplo de StorageDataSource e GetVirtualizedFilesVector Este exemplo mostra como recuperar e exibir imagens na
(Windows 8) biblioteca de imagens do usuário.
Exemplo de invocação de gesto baseado em borda Este exemplo mostra como escutar eventos que ocorrem na
(Windows 8) interface do usuário baseada em borda, usando a
EdgeGesture classe.
Verificar se a sessão atual é um exemplo remoto (Windows Este exemplo demonstra o uso da
8) Windows.System.RemoteDesktop API.
Exemplo de recursos e localização de aplicativos (Windows 8) Este exemplo mostra como usar recursos de aplicativo para
separar conteúdo localizável do código do aplicativo. O
exemplo usa os
Windows.ApplicationModel.Resources.Core
Windows.Globalization namespaces e, e
WinJS.Resources .
Exemplo de menu de contexto (Windows 8) Este exemplo mostra como criar um menu de contexto e
como substituir o menu de contexto padrão por texto. Este
exemplo usa Windows.UI.Popups a API, incluindo o
PopupMenu e o evento oncontextmenu.
Exemplo de caixa de diálogo de mensagem (Windows 8) Este exemplo demonstra como usar um MessageDialog para
exibir caixas de diálogo, definir comandos e suas ações e
alterar o botão padrão. O Windows.UI.Popups namespace
contém a classe MessageDialog.
Exemplo de extensão de mídia MediaStreamSource Este exemplo mostra como dar suporte ao conceito de
(Windows 8) MediaStreamSource do Microsoft Silverlight em um
aplicativo da Windows Store.
Exemplo de texto vertical DirectWrite (Windows 8) Este exemplo usa DirectWrite e Direct2D para exibir
corretamente o texto vertical em uma forma de layout
personalizado.
Exemplo de rotação da cadeia de permuta DXGI (Windows 8) Este exemplo demonstra o método IDXGISwapChain1::
SetRotation e como você pode usar o método em conjunto
com conteúdo de rotação para melhorar o desempenho da
apresentação.
Exemplo de efeitos de imagem personalizada do Direct2D Este exemplo demonstra como implementar efeitos de
(Windows 8) Direct2D personalizados usando pixel, vértice e
sombreadores de computação padrão.
Exemplo de entrada do DirectX Touch (Windows 8) Este exemplo demonstra a navegação por toque e mouse de
um ambiente 3D em um aplicativo C++ com Direct3D.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo do XInput Game Controller (Windows 8) Este exemplo demonstra o uso das APIs XInput em um
aplicativo C++. Ele lê a entrada de um controlador de jogo
do Xbox e exibe dados sobre os movimentos de adesivo
analógico e pressionamentos de botão.
Exemplo de interoperabilidade do Direct3D-Direct2D Este exemplo mostra como interoperar com Direct2D e
(Windows 8) DirectWrite para gravar texto em um destino de
renderização do Direct3D. É uma maneira eficaz de criar
exibições de cabeçotes e de leitura baseadas em texto, como
painéis de pontuação em jogos e aplicativos 3-D.
Exemplo de blocos e crachás do aplicativo (Windows 8) Este exemplo mostra como usar um bloco de aplicativo, que
é a representação e o ponto de partida para seu aplicativo
na tela inicial. Ele também mostra como usar uma notificação
nesse bloco. É um método para o aplicativo retransmitir
informações de status para o usuário quando o aplicativo
não está em execução.
Exemplo de usuário XAML e controles personalizados Este exemplo demonstra como criar e usar elementos XAML
(Windows 8) UserControl e criar controles personalizados para seus
projetos.
ListView XAML e GridView Personalizando amostra de Este exemplo demonstra o modelo de interação do
interatividade (Windows 8) ListView controle.
Exemplo de controle de WebView XAML (Windows 8) Este exemplo demonstra como usar o WebView controle
para exibir uma URL, carregar HTML, interagir com o script
dentro de um WebView e usar o WebViewBrush .
Exemplo de orientação de tela (Windows 8) Este exemplo demonstra como usar a DisplayProperties
classe para definir a orientação de exibição em um aplicativo.
Exemplo de modos de interpolação Direct2D (Windows 8) Este exemplo mostra os vários modos de interpolação
usados pelo Direct2D.
Exemplo de realização de geometria de Direct2D (Windows Este exemplo mostra como o mosaico de geometria de
8) vários núcleos pode ajudar a reduzir o tempo de
renderização de geometria. O uso de máscaras de opacidade
e malhas é uma alternativa à renderização de geometria
tradicional que pode ser melhor em algumas situações.
Exemplo de mapeamento de fonte de idioma (Windows 8) Este exemplo demonstra como obter recomendações de
fontes específicas de idioma usando a LanguageFontGroup
classe no Windows.Globalization.Fonts namespace.
Exemplo de estilo de alto contraste XAML (Windows 8) Este exemplo demonstra várias técnicas para implementar o
suporte para o modo de alto contraste em seu aplicativo. O
suporte para o modo de alto contraste é importante para
tornar seu aplicativo acessível a pessoas com problemas de
eyesight.
Exemplo de recursos de dispositivo de entrada (Windows 8) Este exemplo demonstra como consultar os dispositivos de
entrada que estão conectados ao dispositivo do usuário. E
como dar suporte aos modos de entrada ponteiro, toque,
caneta/caneta, mouse e teclado dos aplicativos da Windows
Store.
Exemplo de políticas EAS para clientes de email (Windows 8) Este exemplo mostra como os clientes de email podem
recuperar informações do dispositivo e trabalhar com
políticas de Exchange Active Sync (EAS) fornecidas. Os
aplicativos da Windows Store podem configurar seus clientes
de email para permanecer em conformidade com as políticas
EAS determinadas.
Exemplo do DirectWrite Hello World (Windows 8) Este exemplo mostra como usar DirectWrite e Direct2D para
renderizar o texto "Olá, Mundo" em um CoreWindow .
Exemplo de compactação (Windows 8) Este exemplo demonstra como ler dados estruturados de
um arquivo e gravar dados compactados em um novo
arquivo e como ler dados compactados e gravar dados
descompactados em um novo arquivo. Muitos aplicativos
precisam compactar e descompactar dados.
Exemplo de plano de fundo de status de rede (Windows 8) Este exemplo demonstra como determinar uma alteração no
perfil de conexão com a Internet registrando um
manipulador de tarefa em segundo plano para o evento de
alteração de status da rede usando uma condição presente
da Internet.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de informações do pacote de aplicativo (Windows Este exemplo mostra como obter informações de pacote
8) usando a API de empacotamento Windows Runtime. Os
usuários adquirem seu aplicativo da Windows Store como
um pacote de aplicativo. O Windows usa as informações em
um pacote de aplicativo para instalar o aplicativo por
usuário.
Exemplo de provisionamento de conta de banda larga móvel Este exemplo demonstra como usar a API do agente de
(Windows 8) provisionamento de banda larga móvel do Windows 8 (
Windows.Networking.NetworkOperators.ProvisioningAgent
) para configurar o Windows 8 com as informações de
conectividade necessárias e o provisionamento de acesso.
Reprodução de mídia para amostra (Windows 8) Este exemplo demonstra a API Play to. Ele mostra como
você pode expandir seu aplicativo de mídia para transmitir
vídeo, áudio e imagens para outros dispositivos em sua rede
local.
Exemplo de teclado de toque de entrada (Windows 8) Este exemplo demonstra como iniciar o teclado de toque
automaticamente em controles personalizados que não são
derivados de controles de plataforma. O exemplo
implementa controles personalizados que exigem entrada de
teclado e não são derivados de controles XAML padrão.
Exemplo de biblioteca de animação XAML (Windows 8) Este exemplo demonstra como animar elementos e aplicar
funções de atenuação às animações para obter vários
efeitos.
Amostra de transformações XAML bidimensional (Windows Este exemplo demonstra como usar transformações
8) bidimensionais para modificar como os elementos são
exibidos em seu aplicativo. Uma transformação define como
mapear, ou transformar, pontos de um espaço de
coordenadas em outro espaço de coordenadas.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de gravação de leitura de dados XML IXmlReader e Este exemplo demonstra como usar IXmlReader e
IXmlWriter (Windows 8) IXmlWriter em seu aplicativo da Windows Store com o
C++. Eles são usados para ler e gravar dados XML de um
arquivo de texto formatado em XML simples. Essas
interfaces fazem parte das APIs do Windows Win32 e COM,
mas têm suporte do Windows Runtime.
Captura de mídia usando o exemplo de dispositivo de Este exemplo demonstra como usar a MediaCapture API
captura (Windows 8) para capturar vídeo, áudio e imagens de um dispositivo de
captura, como uma webcam.
Exemplo de pop-up XAML (Windows 8) Este exemplo demonstra como criar e usar o elemento
Popup XAML em seus projetos.
Exemplo de reprodução de arquivo de áudio XAudio2 Este exemplo demonstra o uso de XAudio2 em um
(Windows 8) aplicativo.
Exemplo do hilo C++ (Windows 8) Este exemplo demonstra como criar um aplicativo da
Windows Store completo usando C++ e XAML. O exemplo
de foto do hilo fornece orientação para desenvolvedores de
C++ que desejam criar um aplicativo do Windows 8 usando
C++, XAML e o Windows Runtime modernos.
Exemplo de processador de texto personalizado DirectWrite Este exemplo mostra como implementar um processador de
(Windows 8) texto personalizado para DirectWrite.
Exemplo de enumeração de fonte DirectWrite (Windows 8) Este exemplo mostra como usar DirectWrite para listar as
fontes na coleção de fontes do sistema em um dispositivo
do usuário.
Exemplo de transformação de perspectiva Direct2D Este exemplo mostra como usar a DrawBitmap API para
(Windows 8) exibir uma imagem com uma transformação de perspectiva
aplicada a ela.
Exemplo de CameraOptionsUI (Windows 8) Este exemplo demonstra como usar as opções de câmera em
um aplicativo de dispositivo. A CameraOptionsUI API exibe
uma interface do usuário para ajustar as configurações da
câmera. Este exemplo requer uma webcam.
Exemplo de reprodução do controlador de áudio XInput Este exemplo demonstra a reprodução de XAudio2 para um
(Windows 8) dispositivo XInput, como um headset, em um aplicativo.
Exemplo de efeito de transformação 3D Direct2D (Windows Este exemplo demonstra os diferentes métodos para
8) transformar uma imagem em um espaço 3D.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de autorização de conta do Windows (Windows 8) Este exemplo demonstra como usar os membros do
Windows.Security.Authentication.OnlineId namespace
para autenticar um usuário com sua conta da Microsoft no
modo de delegação. E como enviar tokens adquiridos para
APIs do Live Connect usando o protocolo REST.
Exemplo de formatação de número e análise (Windows 8) Este exemplo demonstra como usar as DecimalFormatter
classes, CurrencyFormatter , PercentFormatter e
PermilleFormatter no
Windows.Globalization.NumberFormatting namespace.
Eles são usados para exibir e analisar números, moedas e
valores percentuais.
Exemplo de oferta e recuperação de recursos do DXGI Este exemplo demonstra o uso do DXGI
(Windows 8) IDXGIDevice2::OfferResources e
IDXGIDevice2::ReclaimResources APIs em um aplicativo
C++ com DirectX.
Exemplo de agente de autenticação da Web (Windows 8) Este exemplo demonstra a API do agente de autenticação da
Web WinRT. Ele permite que você habilite conexões de logon
único (SSO) para provedores OAuth como Facebook,
Google, Microsoft e Twitter.
Exemplo de efeito de fluxo de áudio XAudio2 (Windows 8) Este exemplo demonstra o streaming de áudio em um
aplicativo C++ usando as APIs XAudio2 e Media
Foundation.
Exemplo de tela inicial (Windows 8) Este exemplo mostra como imitar a tela inicial que o
Windows exibe para seu aplicativo, posicionando uma
imagem semelhante corretamente quando o Windows
ignora a tela inicial exibida.
Exemplo de tarefa de segundo plano do SMS (Windows 8) Este exemplo mostra como usar a API do SMS de banda
larga móvel do Windows 8 ( Windows.Devices.Sms ) com a
API de tarefa em segundo plano (
Windows.ApplicationModel.Background ) para enviar e
receber mensagens de texto SMS.
Exemplo de envio de mensagem do SMS, recebimento e Este exemplo mostra como usar a API de SMS de banda
gerenciamento de SIM (Windows 8) larga móvel do Windows 8 ( Windows.Devices.Sms ).
Exemplo de aplicativo de avaliação e compra no aplicativo Este exemplo demonstra como usar a API de licenciamento
(Windows 8) fornecida pela Windows Store para determinar o status da
licença de um aplicativo ou de um recurso habilitado por
uma compra no aplicativo.
Exemplo de entrada de texto do teclado de toque de entrada Este exemplo mostra como habilitar exibições otimizadas no
(Windows 8) teclado de toque. Ele funciona usando escopos de entrada e
tipos de entrada com controles no WinJS.UI namespace e
com os TextBox RichEdit controles e XAML.
Exemplo de edição de texto XAML (Windows 8) Este exemplo demonstra como usar controles de entrada de
texto em seu aplicativo.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de pool de threads (Windows 8) Este exemplo mostra como executar itens de trabalho de
forma assíncrona usando a API do pool de threads Windows
Runtime.
Exemplo de provedor de janela de núcleo de automação da Este exemplo demonstra como criar um provedor de
interface do usuário (Windows 8) automação de interface do usuário da Microsoft. Ele
disponibiliza informações programáticas sobre um aplicativo
da Windows Store para tecnologias acessíveis, como leitores
de tela. O exemplo é um aplicativo Direct2D.
Exemplo de acessibilidade XAML (Windows 8) Este exemplo mostra como adicionar suporte básico de
acessibilidade ao seu aplicativo.
Exemplo de playlist (Windows 8) Este exemplo demonstra como criar, salvar, exibir e editar
uma lista de reprodução de arquivos de áudio. Este exemplo
usa classes que estão no Windows.Media.Playlists
namespace.
Exemplo de cliente de servidor de mídia (Windows 8) Este exemplo demonstra como criar um cliente de servidor
de mídia usando a API do servidor de mídia. O exemplo de
servidor de mídia demonstra como procurar um servidor de
mídia digital programaticamente em sua rede local e exibir
todos os seus arquivos de vídeo.
Exemplo de aplicativo do Direct2D Magazine (Windows 8) Este exemplo mostra como usar Direct2D, DirectWrite,
Windows Imaging Component (WIC) e XAML para criar um
aplicativo com uma apresentação de tipo de revista.
Exemplo de conta de banda larga móvel e gerenciamento de Este exemplo mostra como usar a API de banda larga móvel
dispositivos (Windows 8) do Windows 8 ( Windows.Networking.NetworkOperators )
empregada por MNO (operadores de rede móvel). Ele
demonstra como usar as APIs MobileBroadbandAccount
para recuperar e exibir contas de banda larga móvel
disponíveis.
Exemplo de proximidade (Windows 8) Este exemplo demonstra como usar as PeerFinder classes
e ProximityDevice para se comunicar com computadores
próximos. Você pode usar a Proximity API para trocar
mensagens pequenas durante um gesto de toque ou
configurar uma conexão de soquete entre aplicativos pares.
Criando um Windows Runtime exemplo de componente em Este exemplo mostra como criar um componente em
processo (C + + CX) (Windows 8) C++/CX que é usado em C++/CX, JavaScript e código de
cliente C#. O projeto OvenServer contém uma classe de
tempo de execução chamada Oven , que implementa uma
IOven interface e uma IAppliance interface.
Exemplo de preferências de rotação automática do Este exemplo mostra como usar a DisplayProperties
dispositivo (Windows 8) classe para tratar e verificar eventos de rotação do
dispositivo.
Exemplo de comunicação em tempo real (Windows 8) Este exemplo demonstra como usar o recurso de baixa
latência para habilitar aplicativos de comunicação em tempo
real.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de compartilhamento de aplicativo de origem de Este exemplo demonstra como um aplicativo pode
conteúdo (Windows 8) compartilhar conteúdo com outro aplicativo. Este exemplo
usa classes do Windows.ApplicationModel.DataTransfer
namespace.
Exemplo de contrato de pesquisa (Windows 8) Este exemplo mostra como permitir que os usuários
pesquisem seu aplicativo quando selecionam o botão
Pesquisar e abrem o painel de pesquisa. E, como usar o
painel de pesquisa para exibir sugestões para as consultas
dos usuários.
Exemplo de notificações brutas (Windows 8) Este exemplo mostra como usar notificações brutas, que são
notificações por push sem nenhuma interface do usuário
associada que executa uma tarefa em segundo plano para o
aplicativo.
Exemplo de efeitos de imagem básica do Direct2D (Windows Este exemplo mostra como carregar uma imagem, aplicar o
8) efeito de desfoque gaussiano a ela e, em seguida, exibi-la em
um Windows::UI::Core::CoreWindow .
Exemplo de efeitos de Direct2D no primitivos (Windows 8) Este exemplo mostra como aplicar efeitos de imagem a
primitivos Direct2D. Este exemplo desenha retângulos
arredondados usando Direct2D e, em seguida, desenha o
texto de DirectWrite no meio dos retângulos. Em seguida,
ele aplica um grafo de efeito a ele.
Exemplo de inicialização de associação (Windows 8) Este exemplo mostra como iniciar o aplicativo padrão do
usuário para o tipo de arquivo ou um protocolo. Você
também pode aprender como habilitar seu aplicativo para
ser o aplicativo padrão para um tipo de arquivo ou um
protocolo.
Exemplo de AtomPub (Windows 8) Este exemplo demonstra como acessar, criar, atualizar e
remover feeds de conteúdo agregados da Web. Ele usa a
implementação Windows Runtime do padrão de publicação
Atom.
Exemplo de registro de certificado (Windows 8) Este exemplo demonstra como criar e registrar um
certificado em uma hierarquia de certificação. Para obter
uma cópia de avaliação do Windows 8, vá para o Windows 8.
Para obter uma cópia de avaliação do Microsoft Visual Studio
2012, vá para o Visual Studio 2012.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de aplicativo da área de transferência (Windows 8) Este exemplo demonstra como um aplicativo pode usar
comandos da área de transferência, incluindo copiar, colar,
recortar e mover. Este exemplo usa classes do
Windows.ApplicationModel.DataTransfer namespace.
Exemplo de modos de efeito composto Direct2D (Windows Este exemplo mostra a ampla variedade de modos
8) compostos e de mistura disponíveis em Direct2D.
Exemplo de mapeamento de choque de Direct3D (Windows Este exemplo demonstra o mapeamento de relevo usando
8) um mapa normal e iluminação por pixel.
Detalhes do calendário e exemplo de matemática (Windows Este exemplo demonstra como usar a Calendar classe no
8) Windows.Globalization namespace para manipular e
processar datas com base em um sistema de calendário e as
preferências de globalização do usuário.
Exemplo de enumeração de dispositivo (Windows 8) Este exemplo mostra como usar a API de enumeração de
dispositivo para localizar os dispositivos disponíveis e
procurar informações do dispositivo. O exemplo apresenta
dois cenários: no primeiro cenário, a API de enumeração de
dispositivo é usada para procurar interfaces de dispositivo
específicas.
Exemplo de texto de parágrafo DirectWrite (Windows 8) Este exemplo mostra como usar DirectWrite e Direct2D para
renderizar texto de parágrafo para um CoreWindow . E,
aplique a justificativa e o espaçamento de caracteres ao
layout.
Respondendo à aparência do exemplo de teclado na tela [Esta documentação é preliminar e está sujeita a alterações.]
(Windows 8) Este exemplo mostra como escutar e responder à aparência
do teclado virtual na tela. Quando o foco é dado a um
elemento que requer entrada de texto em um dispositivo
que não tem um teclado.
Exemplo de vinculação de dados XAML (Windows 8) Este exemplo demonstra técnicas básicas de vinculação de
dados usando a classe Binding e a extensão de marcação
Binding.
Exemplo de tutorial do Direct3D (Windows 8) Este exemplo é um tutorial de cinco lições. Ele fornece uma
introdução à API do Direct3D e apresenta os conceitos e o
código usados em muitos dos outros exemplos do DirectX.
Exemplo de aplicativo de ajuste de foto de efeitos Direct2D Este exemplo mostra várias técnicas comuns de manipulação
(Windows 8) de fotos usando efeitos Direct2Ds. Este exemplo é dividido
em várias partes. Lição 1: mostra as noções básicas de como
carregar e desenhar uma imagem usando efeitos de
Direct2D.
Exemplo de sessão de áudio do Windows (WASAPI) Demonstra como realizar várias tarefas relacionadas a áudio
(Windows 8) usando a API de sessão de áudio do Windows (WASAPI).
Exemplo de nome de domínio do usuário (Windows 8) Este exemplo demonstra a funcionalidade relacionada ao
domínio fornecida pela UserInformation classe do
Windows.System.UserProfile namespace. A classe
UserInformation permite que um aplicativo obtenha e defina
informações sobre o usuário.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de gerenciamento de mensagens USSD (Windows Este exemplo demonstra o gerenciamento de conta de rede
8) usando o protocolo USSD com dispositivos de banda larga
móvel compatíveis com GSM. USSD é normalmente usado
para gerenciamento de conta de um perfil de banda larga
móvel pelo operador de rede móvel (MNO).
Amostra do otimizador de viagens do Bing Maps (Windows O exemplo demonstra como usar o JavaScript e o Visual
8) C++ e criar o aplicativo para o Windows 8 denominado
otimizador de viagens do Bing Maps. O otimizador de
viagens do Bing Maps usa JavaScript para definir a interface
do usuário e o C++ para um algoritmo de custo
computacional em paralelo.
Texto animado de Direct2D e DirectWrite em um exemplo de Este exemplo mostra como usar Direct2D e DirectWrite para
caminho (Windows 8) renderizar uma cadeia de caracteres de texto ao longo de
um caminho geométrico animado e não linear. O aplicativo
renderiza "Olá, mundo!" repetidas várias vezes em idiomas
diferentes ao longo de uma curva de Bézier.
Exemplo de autenticação de hotspot Wi-Fi (Windows 8) Este exemplo demonstra como usar a API de banda larga
móvel do Windows 8 (
Windows.Networking.NetworkOperators ) para
autenticação Wi-Fi HotSpot. Use esse mecanismo como uma
alternativa para configurar credenciais estáticas para um
ponto de Wi-Fi HotSpot.
Exemplo de imagens XAML (Windows 8) Este exemplo demonstra várias técnicas para exibir e
manipular imagens em seu aplicativo usando o controle
Image e a classe BitmapImage.
Exemplo de aplicativo de grupo doméstico (Windows 8) Este exemplo demonstra como usar um HomeGroup para
abrir, Pesquisar e compartilhar arquivos. Este exemplo usa
algumas das HomeGroup opções encontradas no e no
Windows.Storage.Pickers
Windows.Storage.KnownFolders .
Exemplo de contraste e configurações da interface do Este exemplo mostra como usar as APIs de configurações da
usuário (Windows 8) interface do usuário em um aplicativo C# ou JavaScript
básico.
Exemplo de enumeração de pasta (Windows 8) Este exemplo mostra como listar os arquivos e as pastas de
nível superior dentro de um local. (Por exemplo, uma pasta,
um dispositivo ou um local de rede.) E como usar consultas
para listar todos os arquivos dentro de um local
classificando-os em grupos de arquivos.
Exemplo de seletor de arquivo (Windows 8) Este exemplo mostra como acessar arquivos e pastas,
permitindo que o usuário os escolha por meio dos seletores
de arquivos. E como salvar um arquivo para que o usuário
possa especificar o nome, o tipo de arquivo e o local de um
arquivo a ser salvo.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de contratos de seletor de arquivo (Windows 8) Este exemplo mostra como um aplicativo pode fornecer
arquivos, um local de salvamento e atualizações de arquivo
em tempo real para outros aplicativos por meio do seletor
de arquivos. Isso é feito participando do contrato de seletor
de abertura de arquivo, contrato de seletor de salvamento
de arquivo e contrato de atualizador de arquivo em cache.
Exemplo de pesquisa de arquivo programático (Windows 8) Este exemplo mostra como consultar arquivos em locais
como uma pasta, uma biblioteca, um dispositivo ou um local
de rede. Ele usa a Windows.Storage.Search API. As APIs
importantes neste exemplo incluem: QueryOptions classe,
StorageFileQueryResult classe e outras.
Exemplo de miniatura de arquivo e pasta (Windows 8) Este exemplo mostra como recuperar miniaturas de arquivos
e pastas. Ele usa a Windows.Storage.FileProperties API.
Exemplo de manipulações de entrada e gestos (C++) Este exemplo demonstra como manipular a entrada do
(Windows 8) ponteiro e as manipulações de processo e os gestos com as
GestureRecognizer APIs em um aplicativo da Windows
Store usando C++ e DirectX.
Exemplo do gerador de fractal do Direct3D HLSL (Windows Este exemplo demonstra o uso de sombreadores de
8) computação Direct3D HLSL e DirectCompute para criar
imagens de fractal.
Exemplo de efeitos de iluminação de Direct2D XAML Este exemplo demonstra os efeitos de iluminação disponíveis
(Windows 8) em efeitos de Direct2D. As propriedades de efeito de
iluminação são controladas por controles de interface XAML
e, em seguida, exibidas usando Direct2D por meio de um
SwapChainBackgroundPanel XAML.
Exemplo de impressão Direct2Dapp (Windows 8) Este exemplo demonstra como adicionar suporte de
impressão Direct2D a um aplicativo da Windows Store. Este
exemplo mostra como usar os recursos do Direct2D para
renderizar o conteúdo de um aplicativo da Windows Store
para impressão. E como enviar o conteúdo renderizado para
a impressora.
Exemplo de imagens e efeitos de impressão Direct2D Este exemplo demonstra como imprimir imagens Direct2D e
(Windows 8) efeitos de Direct2D em um aplicativo da Windows Store.
Exemplo de texto animado Direct2D (Windows 8) Este exemplo mostra como renderizar texto rapidamente
usando o método Direct2D FillOpacityMask . O exemplo
também responde ao toque. Um pinça de dois dedos pode
ser usado para ampliar e reduzir o texto.
Exemplo de ELS (serviços lingüísticos estendidos) (Windows Este exemplo demonstra o uso de ELS (serviços lingüísticos
8) estendidos) em um aplicativo da Windows Store. O exemplo
implementa cenários que demonstram o uso dos três
serviços ELS disponíveis. Os cenários demonstram como
solicitar um serviço específico.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de teste de clique DirectWrite (Windows 8) Este exemplo mostra como usar os recursos de teste de
clique do DirectWrite. Eles são usados para determinar qual
parte do texto exibido está sendo clicado ou tocado.
Exemplo de objeto embutido DirectWrite (Windows 8) Este exemplo mostra como inserir um objeto embutido em
um layout de texto, como uma imagem.
Amostra de desenho baseado em vetor XAML (Windows 8) Este exemplo demonstra como desenhar gráficos baseados
em vetor em seu aplicativo.
Exemplo de controle de chamada Bluetooth (Windows 8) O exemplo de Bluetooth CallControl demonstra como
configurar o dispositivo de comunicações Bluetooth padrão
para manipular chamadas. Há as versões JavaScript, C#, C++
e VB.Net deste exemplo. Este exemplo requer conhecimento
de eventos do Windows e manipulação de eventos.
Exemplo de lista de comandos Direct2D (Windows 8) Este exemplo demonstra o uso de uma lista de comandos.
Ele é usado para gravar um conjunto de comandos de vetor,
criar um pincel de imagem na lista de comandos e, em
seguida, preencher uma geometria de retângulo com ele. A
lista de comandos preserva a independência de resolução do
vetor.
Exemplo de esboço do controlador JavaScript e XInput Este exemplo demonstra como encapsular a API do XInput
(Windows 8) C++ em um componente Windows Runtime. Em seguida,
ele o chama de um aplicativo da Windows Store usando
JavaScript. Este exemplo implementa um aplicativo de
esboço que permite que você use o controlador de jogo do
Xbox para selecionar a espessura da linha e muito mais.
Exemplo de efeito de matriz Direct2D convolve (Windows 8) Este exemplo demonstra o efeito de Direct2D efeitos de
matriz convolve. Este exemplo tem algumas matrizes de
kernel de convolução de exemplo: passagem (sem operação),
Desfoque de caixa (largura 5), detecção de borda simples,
nitidez simples, relevo, mancha vertical (altura 10)
contratando e mais.
Exemplo de implementação da cadeia de permuta do DirectX Este exemplo mostra como receber CoreWindow eventos
(Windows 8) em um aplicativo nativo e como conectar uma cadeia de
permuta do DirectX à exibição do aplicativo.
Exemplo de animação Direct2D (Windows 8) Este exemplo mostra como usar Direct2D para renderizar e
animar um primitivo Direct2D ao longo de um caminho de
espiral.
Exemplo de compartilhamento de aplicativo de destino de Este exemplo demonstra como um aplicativo pode receber
conteúdo (Windows 8) conteúdo compartilhado de outro aplicativo. Este exemplo
usa classes dos Windows.ApplicationModel.DataTransfer
Windows.ApplicationModel.DataTransfer.Share
namespaces e.
Exemplo de Direct2D salvar no arquivo de imagem Este exemplo mostra como renderizar para a tela usando
(Windows 8) Direct2D e DirectWrite. E como salvar a imagem renderizada
em disco usando a API do WIC.
Dimensionamento de acordo com o exemplo de DPI Este exemplo descreve como criar um aplicativo que é
(Windows 8) dimensionado de acordo com a densidade de pixel da tela.
Ele carrega imagens da escala direita ou substitui o
dimensionamento padrão. Este exemplo usa a
Windows.Graphics.Display API.
Criando um Windows Runtime exemplo de componente em Este exemplo mostra como criar um componente em C# que
processo (C#) (Windows 8) é usado em C++/CX, JavaScript e código de cliente C#. O
projeto OvenServer contém uma classe de tempo de
execução chamada Oven , que implementa uma IOven
interface e uma IAppliance interface.
Exemplo do lado do cliente de notificações periódicas e por Este exemplo mostra como um aplicativo cliente pode se
push (Windows 8) registrar e escutar notificações por push enviadas de um
servidor Web. As notificações por push podem ser usadas
para atualizar um selo ou um bloco, gerar uma notificação
do sistema ou iniciar uma tarefa em segundo plano.
Exemplo de API de dispositivo portátil (Windows 8) Este exemplo mostra como acessar a IPortableDevice API
com de um aplicativo C++. Para saber como acessar a
IPortableDevice API com de um aplicativo C++ de área
de trabalho, consulte o exemplo de API com de dispositivos
portáteis.
Exemplo de personalização da tela de bloqueio (Windows 8) Este exemplo demonstra como usar a LockScreen API para
definir a imagem da tela de bloqueio do usuário atual. Este
exemplo usa classes do Windows.System.UserProfile
namespace.
Exemplo de armário de credenciais (Windows 8) Este exemplo demonstra como usar as APIs do WinRT
PasswordVault e como usar o BitLocker de credencial para
armazenar credenciais da Web. Cenários específicos incluem
um único usuário com um único recurso e vários usuários
com um único recurso.
Amostra de reprodução de vídeo C++ do mecanismo de Este exemplo demonstra a reprodução de vídeo usando a
mídia nativo (Windows 8) MediaEngine API em um aplicativo C++ nativo.
N O M E DA A M O ST RA DESC RIÇ Ã O
Exemplo de extensões de mídia (Windows 8) Este exemplo demonstra como usar extensões de mídia.
Você pode aplicar efeitos ao vídeo, decodificar vídeo e criar
fluxos de mídia usando manipuladores de esquema.
Exemplo de aplicativos de tela de bloqueio (Windows 8) Este exemplo mostra como um aplicativo pode ter uma
presença na tela de bloqueio — a tela que é mostrada
quando o computador está bloqueado — com uma
notificação para fornecer informações de status básicas ou
um bloco para fornecer um status mais detalhado.
Exemplo de exibição de texto XAML (Windows 8) Este exemplo demonstra como controlar a aparência do
texto em seu aplicativo.
Exemplo do Direct3D Sprite (Windows 8) Este exemplo fornece uma implementação de Direct3D de
comportamentos de lote Sprite, semelhante à SpriteBatch
API XNA. Sprites são bitmaps 2D que podem ser
transformados e gerenciados de forma independente em
uma cena 3D, normalmente usados em jogos de 2-d.
Exemplo do Direct3D estereoscópico 3D (Windows 8) Este exemplo demonstra como adicionar um efeito de 3D
estereoscópico a aplicativos C++ usando o Direct3D. Ele
também demonstra como responder às alterações do
sistema estéreo no Direct3D. O efeito de 3D estereoscópico
requer uma exibição que ofereça suporte a estéreo 3-D.
Criando um componente Windows Runtime DLL com C++ Este exemplo mostra como criar um componente DLL em
Sample (Windows 8) processo no Microsoft Visual C++. Ele é usado em C++/CX,
JavaScript e código de cliente C#. O projeto OvenServer
contém uma classe de tempo de execução chamada Oven ,
que implementa uma IOven interface.
Criando um componente Windows Runtime EXE com C++ Este exemplo mostra como criar um componente EXE fora
Sample (Windows 8) do processo no Microsoft Visual C++. Ele é usado em
C++/CX, JavaScript e código de cliente C#. O projeto
OvenServer contém uma classe de tempo de execução
chamada Oven , que implementa uma IOven interface.
Ajuda e comunidade do Microsoft C/C++
13/05/2021 • 2 minutes to read
Aqui está onde obter ajuda e informações sobre como escrever código C++ e usar as ferramentas de
desenvolvimento do Visual Studio.
Exemplos
Exemplos de código para desenvolvedores: contém código de exemplo para download da Microsoft e
colaboradores da Comunidade.
Documentação do produto
C++ no Visual Studio: contém referência e documentação conceitual sobre Visual C++.
Centro de desenvolvedores do Windows: contém informações sobre como usar o C++ e outras
linguagens para desenvolver aplicativos para o Windows 10.
Documentação online e offline
Você pode exibir o conteúdo de desenvolvedor online da Microsoft. Este conteúdo é atualizado regularmente.
Você também pode baixar e exibir o conteúdo localmente no Visualizador da Ajuda offline. A documentação
offline é organizada por livros de conteúdo relacionado, que também são atualizados periodicamente. Você
pode baixar os livros do seu interesse à medida que se tornarem disponíveis. Para obter mais informações,
consulte Microsoft Help Viewer.
Muitas seções da documentação também estão disponíveis em formato PDF. Essas seções têm um link baixar
PDF abaixo do sumário em docs.Microsoft.com.
Sites relacionados
Blog da equipe do c++: contém postagens em vários assuntos de especialistas da equipe de produtos
C++ da Microsoft.
Channel 9: contém entrevistas e palestras em vídeo. Use a caixa de pesquisa na página inicial do Channel
9 para localizar o conteúdo do C++.
Site do Visual Studio: contém artigos e notícias sobre o Visual Studio e as ferramentas de
desenvolvimento relacionadas. Esse site também hospeda os downloads do Visual Studio e os arquivos
redistribuíveis.
Microsoft docs Q&A: fóruns oficiais da Microsoft, onde você pode postar perguntas sobre C++ e Visual
Studio e obter respostas da Microsoft e de especialistas na Comunidade.
Comunidade de desenvolvedores do Visual Studio C++: fóruns para relatar problemas no compilador e
nas ferramentas do c++ ou no IDE, ou para fazer sugestões de produtos. Você pode votar em suas ideias
favoritas ou relatórios de bugs ou adicionar um novo. Este site é monitorado pela equipe de
desenvolvimento.
Como relatar um problema com o conjunto de
ferramentas ou a documentação do Microsoft C++
13/05/2021 • 27 minutes to read
C:\Users\username\Source>cl /Bv
Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26428.1 for x86
Copyright (C) Microsoft Corporation. All rights reserved.
Compiler Passes:
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\cl.exe: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c1.dll: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c1xx.dll: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\c2.dll: Version 19.14.26428.1
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\link.exe: Version 14.14.26428.1
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\mspdb140.dll: Version 14.14.26428.1
C:\Program Files (x86)\Microsoft Visual
Studio\2017\Enterprise\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\1033\clui.dll: Version 19.14.26428.1
Adicione outros detalhes que puderem nos ajudar a diagnosticar o problema encontrado, como soluções
alternativas que você possa ter descoberto. Evite repetir informações encontradas em outro lugar no relatório.
A reprodução
Uma reprodução é um exemplo de código-fonte completo e independente. Ela demonstra o problema
encontrado de forma reproduzível, por isso o nome. Precisamos de uma reprodução para que possamos
reproduzir o erro em nossos computadores. O código deve ser suficiente por si só para criar um executável
básico que compila e executa. Ou que compilaria e executaria caso você não encontrasse o problema. Uma
reprodução não é um snippet de código. Ela deve ter classes e funções completas e conter todas as diretivas
#include necessárias, mesmo para os cabeçalhos padrão.
O que compõe uma boa reprodução
Uma boa reprodução é:
Muito. As reproduções devem ter o menor tamanho possível enquanto ainda demonstram exatamente o
problema encontrado. As reproduções não precisam ser complexas ou realistas. Elas precisam apenas
mostrar o código que está em conformidade com o padrão ou para a implementação documentada do
compilador. Caso não haja um diagnóstico, sua reprodução deve mostrar o código que não é compatível.
As reproduções simples e objetivas, contendo apenas o código necessário para demonstrar o problema,
são as melhores. Se você puder eliminar ou simplificar o código de modo que ele permaneça compatível
e deixe o problema inalterado, faça isso. Não é necessário incluir contraexemplos de códigos que
funcionam.
Independente. As reproduções devem evitar dependências desnecessárias. Se você puder reproduzir o
problema sem bibliotecas de terceiros, faça isso. Se puder reproduzir o problema sem nenhum código de
biblioteca além de instruções de saída simples (por exemplo, puts("this shouldn't compile"); ,
std::cout << value; e printf("%d\n", value); ), faça isso. O ideal é que o exemplo possa ser
condensado em um único arquivo de código-fonte, sem referência a nenhum cabeçalho de usuário.
Reduzir a quantidade de código que precisamos considerar como um possível colaborador para o
problema é extremamente útil para nós.
Com a versão mais recente do compilador. As reproduções devem usar a atualização mais recente
da versão mais recente do conjunto de ferramentas sempre que possível. Ou use a versão mais recente
de pré-lançamento da próxima atualização ou da próxima versão principal. Em versões mais recentes, os
problemas que podem ocorrer nas versões mais antigas do conjunto de ferramentas frequentemente
foram corrigidos. As correções são implementadas em versões mais antigas apenas em circunstâncias
excepcionais.
Comparadas com outros compiladores , se for relevante. As reproduções que envolvem código C++
portátil devem verificar o comportamento em relação a outros compiladores se possível. O padrão C++
acaba por determinar a correção do programa e nenhum compilador é perfeito. No entanto, quando o
Clang e o GCC aceitam seu código sem um diagnóstico e o MSVC não, você provavelmente encontrou
um bug em nosso compilador. (Outras possibilidades incluem diferenças no comportamento do UNIX e
do Windows, ou níveis diferentes de implementação de padrões do C++ e assim por diante.) Quando
todos os compiladores rejeitam seu código, é provável que seu código esteja incorreto. Ver mensagens
de erro diferentes pode ajudá-lo a diagnosticar o problema por conta própria.
Você pode encontrar listas de compiladores online nos quais pode testar seu código em Compiladores
C++ Online no site do ISO C++ ou nesta Lista de Compiladores C++ Online no GitHub. Alguns exemplos
específicos incluem o Wandbox e o Gerenciador do compilador.
NOTE
Os sites de compiladores online não são afiliados à Microsoft. Muitos sites de compilador online são executados
como projetos pessoais. Alguns desses sites podem estar indisponíveis quando você ler isto, mas uma pesquisa
deve localizar outros que você pode usar.
SandBoxHost.cpp
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1369)
To work around this problem, try simplifying or changing the program near the
locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
d:\o\dev\search\foundation\common\tools\sandbox\managed\managed.h(929):
note: This diagnostic occurred in the compiler generated function
'void Microsoft::Ceres::Common::Tools::Sandbox::SandBoxedProcess::Dispose(bool)'
Internal Compiler Error in d:\o\dev\otools\bin\x64\cl.exe. You will be prompted
to send an error report to Microsoft later.
INTERNAL COMPILER ERROR in 'd:\o\dev\otools\bin\x64\cl.exe'
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
repro.cpp
\\officefile\public\tadg\vc14\comperror\repro.cpp(13) : fatal error C1001:
An internal error has occurred in the compiler.
(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 230)
To work around this problem, try simplifying or changing the program near the
locations listed above.
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
INTERNAL COMPILER ERROR in
'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\cl.exe'
Please choose the Technical Support command on the Visual C++
Help menu, or open the Technical Support help file for more information
Se a linha que começa com INTERNAL COMPILER ERROR menciona link.exe, em vez de cl.exe, a LTCG estava
habilitada. Forneça uma reprodução de vinculação nesse caso. Quando não está claro na mensagem de erro se
o LTCG estava habilitado, examine os argumentos da linha de comando. Você os copiou do log de build em uma
etapa anterior do argumento de linha de comando /GL .
Falha de vinculador
As falhas de vinculador ocorrerem durante a fase de vinculação, depois que o compilador foi executado.
Normalmente, o vinculador emitirá o Erro das Ferramentas de Vinculador LNK1000.
NOTE
Se a saída menciona C1001 ou envolve a Geração de Código Durante o Tempo de Vinculação, confira Falha de back-end
(geração de código) em vez disso.
Version 14.00.22816.0
ExceptionCode = C0000005
ExceptionFlags = 00000000
ExceptionAddress = 00007FF73C9ED0E6 (00007FF73C9E0000)
"z:\tools\bin\x64\link.exe"
NumberParameters = 00000002
ExceptionInformation[ 0] = 0000000000000000
ExceptionInformation[ 1] = FFFFFFFFFFFFFFFF
CONTEXT:
Se a vinculação incremental está habilitada e a falha ocorreu apenas após uma vinculação inicial bem-sucedida,
isto é, apenas após a primeira vinculação completa na qual a vinculação incremental posterior se baseia, forneça
também uma cópia dos arquivos de objeto (.obj) e de biblioteca (.lib) que correspondem aos arquivos de origem
modificados após a vinculação inicial ter sido concluída.
Geração de código incorreto
A geração de código incorreto é rara. Isso acontece quando o compilador gera código incorreto por engano, o
que faz com que o aplicativo falhe no runtime. Em vez disso, ele deve gerar código ou detectar um problema no
momento da compilação. Se você acreditar que o problema encontrado resulta na geração de código incorreto,
trate o relatório da mesma forma que uma Falha de back-end (geração de código).
Para esse tipo de falha, ofereça uma reprodução de vinculação se estiver usando o argumento de linha de
comando /GL para cl.exe. Caso contrário, forneça uma Reprodução pré-processada.
NOTE
As reproduções pré-processadas não são tão úteis para problemas que podem ser resultantes de bugs em nossa
implementação de biblioteca padrão porque geralmente queremos substituir nossa implementação mais recente, em
andamento, para ver se já corrigimos o problema. Nesse caso, não pré-processe a reprodução e, se você não puder
reduzir o problema para um único arquivo de origem, compacte seu código em um arquivo .zip ou semelhante ou
considere usar uma reprodução de projeto do IDE. Para obter mais informações, consulte Outras reproduções.
NOTE
Independentemente de como você enviar seu relatório, a Microsoft respeita sua privacidade. A Microsoft está
comprometida com a conformidade com todas as leis e regulamentos de privacidade de dados. Para obter informações
sobre como tratamos os dados que você nos envia, confira a Política de privacidade da Microsoft.
Relatórios e privacidade
Todas as informações em relatórios e quaisquer comentários e respostas são publicamente
visíveis por padrão . Normalmente, isso é uma vantagem, pois permite que toda a comunidade veja os
problemas, as soluções e alternativas encontradas por outros usuários. No entanto, se você está preocupado em
tornar seus dados ou a sua identidade pública, por motivos de propriedade intelectual ou de privacidade, há
opções.
Se você está preocupado com a revelação da sua identidade, crie uma conta Microsoft que não divulgue todos
os detalhes sobre você. Use essa conta para criar seu relatório.
Não coloque algo que você deseja manter par ticular no título ou no conteúdo do relatório inicial,
que é público. Em vez disso, diga que você enviará detalhes em particular em um comentário separado. Para
ter certeza de que o relatório será direcionado às pessoas certas, inclua cppcompiler na lista de tópicos do seu
relatório de problemas. Depois de criar o relatório de problemas, é possível especificar quem pode ver suas
respostas e anexos.
Para criar um relatório de problemas para informações particulares
1. No relatório que você criou, escolha Adicionar comentário para criar sua descrição privada do
problema.
2. No editor de resposta, use o controle de lista suspensa abaixo dos botões Enviar e Cancelar para
especificar o público-alvo para a sua resposta. Somente as pessoas que você especificar podem ver essas
respostas privadas e imagens, links ou código que você incluir. Escolha Visível por moderadores e o
car taz original para limitar a visibilidade aos funcionários da Microsoft e a você mesmo.
3. Adicione a descrição e quaisquer outras informações, imagens e anexos de arquivo necessários para a
reprodução. Escolha o botão Enviar para enviar essas informações em particular.
Há um limite de 2 GB para arquivos anexados e de no máximo 10 arquivos. Para uploads maiores, solicite
uma URL de upload no seu comentário particular.
Quaisquer respostas sob esse comentário têm a mesma visibilidade restrita que você especificou. Isso é
verdadeiro mesmo se o controle de lista suspensa em respostas não mostra o status de visibilidade restrito
corretamente.
Para manter sua privacidade e manter suas informações confidenciais ocultas do público, seja cuidadoso.
Mantenha todas as interações com a Microsoft nas respostas ao comentário restrito. Respostas a outros
comentários podem gerar a divulgação acidental de informações confidenciais.
Se você ainda não baixou e instalou Visual Studio ferramentas do Microsoft C/C++, veja como começar.
NOTE
Este tópico se aplica à instalação do Visual Studio no Windows. Visual Studio Code é um ambiente de desenvolvimento
leve e de plataforma cruzada executado em sistemas Windows, Mac e Linux. O Microsoft C/C++ para Visual Studio Code
extensão dá suporte ao IntelliSense, depuração, formatação de código, preenchimento automático. Visual Studio para Mac
dá suporte ao Microsoft C++, mas dá suporte a linguagens .NET e desenvolvimento de plataforma cruzada. Para obter
instruções de instalação, consulte Instalar Visual Studio para Mac.
Quer saber mais sobre quais são as outras novidades nesta versão? Consulte as notas Visual Studio versão do .
Pronto para instalar? Guiaremos você no processo, passo a passo.
Etapa 1 - Verificar se o computador está pronto para o Visual Studio
Antes de começar a instalação do Visual Studio:
1. Verifique os requisitos do sistema. Esses requisitos ajudam você a saber se o computador dá suporte ao
Visual Studio 2019.
2. Aplique as atualizações mais recentes do Windows. Essas atualizações garantem que o computador tenha
as atualizações de segurança mais recentes e os componentes de sistema obrigatórios para o Visual
Studio.
3. Reinicialize. Isso garante que todas as instalações ou atualizações pendentes não atrapalhem a instalação
do Visual Studio.
4. Libere espaço. Remova arquivos e aplicativos desnecessários de %SystemDrive%, por exemplo,
executando o aplicativo Limpeza de Disco.
Para solucionar dúvidas sobre a execução de versões anteriores do Visual Studio lado a lado com o Visual Studio
2019, veja a página Direcionamento e compatibilidade da plataforma Visual Studio 2019.
Etapa 2 - Baixar o Visual Studio
Em seguida, baixe o arquivo bootstrapper do Visual Studio. Para fazer isso, escolha o botão a seguir para ir para
a página Visual Studio download. Selecione a edição do Visual Studio que você deseja e escolha o botão
Avaliação gratuita ou Download gratuito.
B AIXAR O V ISU AL
S TU D IO
Para suporte principal a C e C++, escolha a carga de trabalho "Desenvolvimento para área de trabalho
com C++". Ela vem com o editor de núcleo padrão, que inclui o suporte à edição de código básico para
mais de 20 linguagens, a capacidade de abrir e editar o código de qualquer pasta sem precisar de um
projeto e o controle do código-fonte integrado.
Cargas de trabalho adicionais suportam outros tipos de desenvolvimento. Por exemplo, escolha a carga
de trabalho "Desenvolvimento Windows Plataforma Universal" para criar aplicativos que usam o runtime
Windows para o Microsoft Store. Escolha "Desenvolvimento de jogos com C++" para criar jogos que
usam DirectX, Unreal e Cocos2d. Escolha "Desenvolvimento do Linux com C++" para direcionar
plataformas Linux, incluindo desenvolvimento de IoT.
O painel Detalhes da instalação lista os componentes incluídos e opcionais instalados por cada carga
de trabalho. Você pode selecionar ou desmarcar componentes opcionais nesta lista. Por exemplo, para
dar suporte ao desenvolvimento usando os Visual Studio 2017 ou 2015, escolha os componentes
opcionais MSVC v141 ou MSVC v140. Você pode adicionar suporte para MFC, a extensão de linguagem
de Módulos experimentais, IncrediBuild e muito mais.
2. Depois de escolher as cargas de trabalho e os componentes opcionais que deseja, escolha Instalar .
Em seguida, serão exibidas telas de status que mostram o progresso da instalação do Visual Studio.
TIP
A qualquer momento após a instalação, você pode instalar as cargas de trabalho ou os componentes não instalados
inicialmente. Se você tiver Visual Studio, acesse Ferramentas Obter Ferramentas e > Recursos... que abre o Instalador do
Visual Studio. Outra opção é abrir o Instalador do Visual Studio no menu Iniciar. Assim, é possível escolher as cargas
de trabalho ou os componentes que você deseja instalar. Em seguida, escolha Modificar .
IMPORTANT
Você pode selecionar uma unidade diferente apenas quando você instala o Visual Studio pela primeira vez. Se você já tiver
instalado e quiser alterar unidades, precisará desinstalar o Visual Studio e, em seguida, reinstalá-lo.
TIP
A edição Community é para desenvolvedores individuais, aprendizado em sala de aula, pesquisa acadêmica e
desenvolvimento de software livre. Para outros usos, instale o Visual Studio 2017 Professional ou o Visual Studio
2017 Enterprise.
2. Encontre o arquivo do instalador que você baixou e execute-o. O arquivo baixado pode ser exibido no
navegador ou você pode encontrá-lo na pasta Downloads. O instalador precisa de privilégios de
Administrador para ser executado. Você pode ver uma caixa de diálogo Controle de Conta de Usuário
solicitando que você dê permissão para permitir que o instalador faça alterações em seu sistema; escolha
Sim. Se você estiver tendo problemas, encontre o arquivo baixado no Explorador de Arquivos, clique
com o botão direito do mouse no ícone do instalador e escolha Executar como Administrador no menu
de contexto.
3. O instalador apresenta uma lista de cargas de trabalho, que são grupos de opções relacionadas para
áreas de desenvolvimento específicas. O suporte para C++ agora faz parte de cargas de trabalho
opcionais que não estão instaladas por padrão.
Para C e C++, selecione a carga de trabalho Desenvolvimento para desktop com C++ e, em seguida,
escolha Instalar .
4. Quando a instalação for concluída, escolha o botão Iniciar para iniciar Visual Studio.
Na primeira vez que você Visual Studio, será solicitado que você entre com uma conta da Microsoft. Caso
não tenha uma, você pode criá-la gratuitamente. Você também deve escolher um tema. Não se preocupe,
você poderá alterá-lo mais tarde se quiser.
Pode levar Visual Studio alguns minutos para se preparar para uso na primeira vez que você o executar.
Veja como é a aparência em um rápido tempo de tempo:
Visual Studio começa muito mais rapidamente quando você o executar novamente.
5. Quando Visual Studio, verifique se o ícone de sinalizador na barra de título está realçada:
Se estiver realçada, selecione-a para abrir a janela Notificações. Se houver atualizações disponíveis para
Visual Studio, recomendamos instalá-las agora. Quando a instalação for concluída, reinicie Visual Studio.
Próximas etapas
Criar um projeto C++
https://docs.microsoft.com/
Criar um projeto de aplicativo de console C++
30/07/2021 • 6 minutes to read
O ponto de partida usual para um programador de C++ é um aplicativo "Olá, mundo!" executado na linha de
comando. Isso é o que você criará em Visual Studio nesta etapa.
Pré-requisitos
Ter o Visual Studio com o desenvolvimento de Desktop com carga de trabalho do C++ instalada e em
execução no seu computador. Se ele ainda não estiver instalado, confira Instalar suporte para C++ no Visual
Studio.
2. Na caixa de diálogo Configurar seu novo projeto, insira HelloWorld na caixa Project de edição de
nome. Escolha Criar para criar o projeto.
Visual Studio cria um novo projeto. Ele está pronto para você adicionar e editar seu código-fonte. Por
padrão, o modelo aplicativo de console preenche seu código-fonte com um aplicativo "Olá, Mundo":
Quando o código for assim no editor, você estará pronto para ir para a próxima etapa e criar seu
aplicativo.
Houve um problema.
1. No Visual Studio, abra o menu Arquivo e escolha Novo > Project para abrir a caixa de diálogo Novo
Project.
2. Na caixa de Project, selecione Instalado > Visual C++ se ele ainda não estiver selecionado e, em
seguida, escolha o modelo Project vazio. No campo Nome, insira HelloWorld. Escolha OK para criar o
projeto.
Visual Studio cria um projeto novo e vazio. Ele está pronto para você se especializar para o tipo de aplicativo que
deseja criar e para adicionar seus arquivos de código-fonte. Você fará isso em seguida.
Houve um problema.
Visual Studio agora sabe como criar seu projeto para ser executado em uma janela do console. Em seguida, você
adicionará um arquivo de código-fonte e inserirá o código do aplicativo.
Houve um problema.
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
Quando o código for assim no editor, você estará pronto para ir para a próxima etapa e criar seu aplicativo.
Houve um problema.
Próximas etapas
Criar e executar um projeto C++
Você criou um projeto de aplicativo de console do C++ e entrou em seu código. Agora você pode criar e
executar o Visual Studio. Em seguida, execute-o como um aplicativo autônomo na linha de comando.
Pré-requisitos
Ter o Visual Studio com o desenvolvimento de Desktop com carga de trabalho do C++ instalada e em
execução no seu computador. Se ele ainda não estiver instalado, siga as etapas em Instalar o suporte ao
C++ no Visual Studio.
Criar um aplicativo "Olá, Mundo!" projeto e insira seu código-fonte. Se você ainda não tiver feito essa
etapa, siga as etapas em Criar um projeto de aplicativo de console do C++.
Se Visual Studio for assim, você estará pronto para criar e executar seu aplicativo:
Uma janela do console é aberta e, em seguida, executa seu aplicativo. Quando você inicia um aplicativo
de console no Visual Studio, ele é executado em seu código e, em seguida, imprime "Pressione qualquer
tecla para continuar. . ." para dar a oportunidade de ver a saída.
Parabéns! Você criou seu primeiro aplicativo de console "Olá, mundo!" no Visual Studio! Pressione uma tecla
para ignorar a janela do console e retornar ao Visual Studio.
Houve um problema.
Próximas etapas
Depois de ter criado e executado esse aplicativo simples, você estará pronto para projetos mais complexos. Para
obter mais informações, consulte Using the Visual Studio IDE for C++ Desktop Development. Ele tem
explicações passo a passo mais detalhadas que exploram as funcionalidades do Microsoft C++ Visual Studio.
O ponto de partida usual para um programador de C++ é um aplicativo "Olá, mundo!" executado na linha de
comando. Isso é o que você criará primeiro Visual Studio neste artigo e, em seguida, passaremos para algo mais
desafiador: um aplicativo de calculadora.
Pré-requisitos
Tenha Visual Studio com a carga de trabalho Desenvolvimento da área de trabalho com C++ instalada e
em execução no computador. Se ele ainda não estiver instalado, confira Instalar suporte para C++ no Visual
Studio.
Caso contrário, na barra de menus Visual Studio, escolha Arquivo > > Novo Project . A janela Criar
um novo projeto é aberta.
2. Na lista de modelos de projeto, escolha Aplicativo de Console e, em seguida, escolha Avançar .
IMPORTANT
É preciso que você escolha a versão do C++ do modelo do Aplicativo de Console . Ele tem as marcas C++ ,
Windows e Console , enquanto o ícone tem "++" no canto.
3. Na caixa de diálogo Configurar novo projeto , selecione a caixa de edição Nome do projeto , dê ao
novo projeto o nome CalculatorTutorial e, em seguida, escolha Criar .
Um aplicativo de console do Windows C++ vazio é criado. Os aplicativos de console usam uma janela de
console do Windows para exibir a saída e aceitar a entrada do usuário. No Visual Studio, uma janela do
editor é aberta e mostra o código gerado:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
2. Para executar o código, na barra de menus, escolha Depurar , Iniciar sem depuração .
Uma janela do console é aberta e, em seguida, executa seu aplicativo. Quando você inicia um aplicativo
de console no Visual Studio, ele é executado em seu código e, em seguida, imprime "Pressione qualquer
tecla para fechar esta janela. . ." para dar a oportunidade de ver a saída. Parabéns! Você criou seu
primeiro aplicativo de console "Olá, mundo!" no Visual Studio!
3. Pressione uma tecla para ignorar a janela do console e retornar ao Visual Studio.
Agora você tem as ferramentas para compilar e executar seu aplicativo após cada alteração para verificar se o
código ainda funciona conforme o esperado. Posteriormente, mostraremos como depurá-lo se ele não
funcionar bem.
Editar o código
Agora vamos examinar o código neste modelo em um aplicativo de calculadora.
1. No arquivo CalculatorTutorial.cpp, edite o código para corresponder a este exemplo:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include <iostream>
int main()
{
cout << "Calculator Console Application" << endl << endl;
cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
<< endl;
return 0;
}
2. Para salvar o arquivo, insira Ctrl+S ou escolha o ícone Salvar ao lado da parte superior do IDE, o ícone
de disquete na barra de ferramentas na barra de menus.
3. Para executar o aplicativo, pressione CTRL+F5 ou vá para o menu Depurar e escolha Iniciar Sem
Depuração . Você deve ver uma janela do console em exibição com o texto especificado no código.
4. Feche a janela do console ao terminar.
Adicionar código para fazer alguns cálculos matemáticos
É hora de adicionar alguma lógica de matemática.
Para adicionar uma classe de Calculadora
1. Vá para o menu Projeto e escolha Adicionar Classe . Na caixa de edição Nome de Classe , digite
Calculadora. Selecione OK . Dois novos arquivos são adicionados ao seu projeto. Para salvar todos os
arquivos alterados de uma vez, pressione Ctrl+Shift+S . É um atalho de teclado para Arquivo > Salvar
Tudo. Também há um botão de barra de ferramentas para Salvar Tudo , um ícone de dois disquetes,
encontrado ao lado do botão Salvar . Em geral, é uma boa prática executar Salvar Tudo com frequência,
para que você não perca nenhum arquivo ao salvar.
Uma classe é como um blueprint para um objeto que faz algo. Nesse caso, definimos uma calculadora e
como ela deve funcionar. O assistente Adicionar Classe usado acima criou arquivos .h e .cpp que têm o
mesmo nome que a classe. Você pode ver uma lista completa dos arquivos de projeto na Gerenciador
de Soluções, visível no lado do IDE. Se a janela não estiver visível, você poderá abri-la na barra de
menus: escolha Exibir > Gerenciador de Soluções .
Agora você deve ter três guias abertas no editor: CalculatorTutorial.cpp, Calculator.h e Calculator.cpp. Se
você fechar acidentalmente uma delas, poderá reabri-la clicando duas vezes na janela Gerenciador de
Soluções janela.
2. Em Calculator.h , remova as linhas Calculator(); e ~Calculator(); que foram geradas, já que você não
precisa delas aqui. Em seguida, adicione a seguinte linha de código para que o arquivo agora tenha esta
aparência:
#pragma once
class Calculator
{
public:
double Calculate(double x, char oper, double y);
};
Compreender o código
A linha que você adicionou declara uma nova função chamada Calculate , que usaremos para
executar operações matemáticas para adição, subtração, multiplicação e divisão.
O código C++ é organizado em arquivos de cabeçalho (.h) e de origem (.cpp). Várias outras
extensões de arquivo têm suporte pelos vários compiladores, mas estes são os principais
conhecer. Funções e variáveis normalmente são declaradas, ou seja, recebem um nome e um tipo,
nos arquivos de cabeçalho, e implementadas ou recebem uma definição nos arquivos de origem.
Para acessar código definido em outro arquivo, você pode usar #include "filename.h" , em que
'filename.h' é o nome do arquivo que declara as variáveis ou funções que você deseja usar.
As duas linhas que você excluiu declararam um construtor e um destruidor para a classe. Para
uma classe simples como essa, o compilador as cria para você e seus usos estão além do escopo
deste tutorial.
É uma boa prática organizar seu código em arquivos diferentes com base no que ele faz, de modo
que seja fácil encontrar o código de que você precisa mais tarde. Em nosso caso, definimos a
classe Calculator separadamente do arquivo que contém a função main() , mas podemos
planejar fazer referência à classe Calculator em main() .
3. Você verá um rabisco verde aparecer sob Calculate . Ocorre porque ainda não definimos a função
Calculate no arquivo .cpp. Passe o mouse sobre a palavra, clique na lâmpada (neste caso, uma chave de
fenda) que aparece em pop-up e escolha Criar uma definição de 'Calculate' em Calculator.cpp .
Um pop-up será exibido, possibilitando uma espiada na alteração de código que foi feita em outro
arquivo. O código foi adicionado ao Calculator.cpp.
Atualmente, retorna apenas 0,0. Vamos mudar isso. Pressione Esc para fechar o pop-up.
4. Alterne para o arquivo Calculator.cpp na janela do editor. Remova as seções Calculator() e
~Calculator() (como fez no arquivo .h) e adicione o seguinte código a Calculate() :
#include "Calculator.h"
Compreender o código
A função Calculate consome um número, um operador e um segundo número e, em seguida,
executa a operação solicitada nos números.
A instrução de opção verifica que operador foi fornecido e somente executa o caso que
corresponde a essa operação. O padrão: caso é uma contingência se o usuário digita um operador
que não é aceito, de modo que o programa não seja interrompido. Em geral, é melhor manipular
uma entrada de usuário inválida de uma maneira mais elegante, mas isso está além do escopo
deste tutorial.
A double palavra-chave denota um tipo de número que dá suporte a decimais. Dessa forma, a
calculadora pode lidar com matemática decimal e de inteiros. A função é necessária para sempre
retornar esse número devido ao no início do código (isso indica o tipo de retorno da função), que
é o motivo pelo qual retornamos Calculate 0,0 mesmo no caso double padrão.
O arquivo .h declara a função protótipo, que informa ao compilador antecipadamente quais
parâmetros são necessários e que tipo de retorno esperar dele. O arquivo .cpp tem todos os
detalhes de implementação da função.
Se você compilar e executar o código novamente neste ponto, ele ainda será encerrado depois de perguntar
qual operação executar. Em seguida, você modificará a função main para fazer alguns cálculos.
Para chamar funções de membro da classe Calculadora
1. Agora vamos atualizar a função main em CalculatorTutorial.cpp:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include <iostream>
#include "Calculator.h"
int main()
{
double x = 0.0;
double y = 0.0;
double result = 0.0;
char oper = '+';
Calculator c;
while (true)
{
cin >> x >> oper >> y;
result = c.Calculate(x, oper, y);
cout << "Result is: " << result << endl;
}
return 0;
}
Compreender o código
Uma vez que os programas C++ sempre começam com a função main() , precisamos chamar o
outro código daí, portanto, uma instrução #include é necessária.
Algumas variáveis iniciais x , y , oper e result são declaradas para armazenar o primeiro
número, o segundo número, o operador e o resultado final, respectivamente. É sempre uma boa
prática fornecer alguns valores iniciais para evitar um comportamento indefinido, o que é feito
aqui.
A linha Calculator c; declara um objeto chamado 'c' como uma instância da classe Calculator .
A classe em si é apenas o blueprint para como as calculadoras funcionam; o objeto é a calculadora
específica que faz os cálculos.
A instrução while (true) é um loop. O código dentro do loop continua sendo executado
repetidamente enquanto a condição em () se aplicar. Como a condição é simplesmente listada
como true , ela é sempre verdadeira, portanto, o loop é executado para sempre. Para fechar o
programa, o usuário deve fechar manualmente a janela do console. Caso contrário, o programa
sempre esperará a nova entrada.
A palavra-chave cin é usada para aceitar a entrada do usuário. Esse fluxo de entrada é inteligente
o suficiente para processar uma linha de texto inserida na janela do console e colocá-la dentro de
cada uma das variáveis listadas, em ordem, supondo que a entrada do usuário corresponda à
especificação necessária. Você pode modificar essa linha para aceitar diferentes tipos de entrada,
por exemplo, mais de dois números, embora a função Calculate() também precise ser atualizada
para lidar com isso.
A expressão c.Calculate(x, oper, y); chama a função Calculate definida anteriormente e
fornece os valores de entrada inseridos. A função retorna um número que é armazenado em
result .
Por fim, result é impresso no console para que o usuário veja o resultado do cálculo.
Compilar e testar o código novamente
Agora é hora de testar o programa novamente para verificar se que tudo está funcionando bem.
1. Pressione Ctrl+F5 para recompilar e iniciar o aplicativo.
2. Insira 5 + 5 e pressione Enter . Verifique se o resultado será 10.
Depurar o aplicativo
Uma vez que o usuário é livre para digitar qualquer coisa na janela do console, vamos garantir que a
calculadora lide com alguma entrada conforme o esperado. Em vez de executar o programa, vamos depurá-lo
para que seja possível inspecionar o que ele está fazendo em detalhes, passo a passo.
Para executar o aplicativo no depurador
1. Defina um ponto de interrupção na linha result = c.Calculate(x, oper, y); , logo após o usuário ter sido
solicitado a inserir a entrada. Para definir um ponto de interrupção, clique Para fazer isso, clique ao lado
da linha na barra vertical cinza ao longo da borda esquerda da janela do editor. Um ponto vermelho é
exibido.
Agora quando depuramos o programa, ele sempre pausa a execução nessa linha. Já temos uma ideia
superficial de que o programa funciona para casos simples. Como não queremos pausar a execução toda
vez, vamos tornar o ponto de interrupção condicional.
2. Clique com o botão direito do mouse no ponto vermelho que representa o ponto de interrupção e
escolha Condições . Na caixa de edição para a condição, insira (y == 0) && (oper == '/') . Escolha o
botão OK quando tiver terminado. A condição é salva automaticamente.
Agora vamos pausar a execução no ponto de interrupção especificamente se você tentar uma divisão por
0.
3. Para depurar o programa, pressione F5 ou escolha o botão da barra de ferramentas Depurador Local
do Windows que tem um ícone de seta verde. Em seu aplicativo de console, se você digitar algo como
"0-5", o programa se comportará normalmente e continuará em execução. No entanto, se você digitar
"10 / 0", ele fará uma pausa no ponto de interrupção. Você pode até mesmo colocar qualquer número de
espaços entre o operador e os números. cin é inteligente o suficiente para analisar a entrada de modo
adequado.
Janelas úteis no depurador
Sempre que você depura seu código, pode perceber que algumas novas janelas aparecem. Essas janelas podem
ajudar a sua experiência de depuração. Dê uma olhada na janela Autos . A janela Autos mostra os valores atuais
das variáveis usadas pelo menos três linhas antes e até a linha atual. Para ver todas as variáveis dessa função,
alterne para a janela Locais . Na verdade, você pode modificar os valores dessas variáveis enquanto depura para
ver que efeito elas teriam sobre o programa. Neste caso, podemos deixá-las de lado.
Também é possível apenas focalizar variáveis no código em si para ver seus valores atuais em que a execução
está em pausa momento. Verifique se a janela do editor está em foco clicando nela primeiro.
Parece que o programa está fazendo o que é esperado: ele usa o primeiro número e o divide pelo
segundo. Na linha cout , focalize a variável result ou dê uma olhada result na janela Autos . Você
verá que seu valor está listado como "inf", o que não parece correto, então vamos corrigi-lo. A linha
cout somente gera qualquer valor que esteja armazenado em result , portanto, quando você avança
mais uma linha usando F10 , a janela do console exibe:
Esse resultado acontece porque a divisão por zero é indefinida, portanto, o programa não tem uma
resposta numérica para a operação solicitada.
Para consertar o erro de "dividir por zero"
Vamos tratar da divisão por zero de modo mais simples para que um usuário possa entender o problema.
1. Faça as seguintes alterações a CalculatorTutorial.cpp. (Você pode deixar o programa em execução durante
a edição, graças a um recurso do depurador chamado Editar e Continuar ):
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include <iostream>
#include "Calculator.h"
int main()
{
double x = 0.0;
double y = 0.0;
double result = 0.0;
char oper = '+';
Calculator c;
while (true)
{
cin >> x >> oper >> y;
if (oper == '/' && y == 0)
{
cout << "Division by 0 exception" << endl;
continue;
}
else
{
result = c.Calculate(x, oper, y);
}
cout << "Result is: " << result << endl;
}
return 0;
}
2. Agora pressione F5 uma vez. A execução do programa continua até ele precisar pausar para pedir
entrada do usuário. Insira 10 / 0 novamente. Agora, é impressa uma mensagem mais útil. O usuário é
solicitado a fornecer mais entradas e o programa continua em execução normalmente.
NOTE
Quando você edita o código no modo de depuração, há um risco de o código se tornar obsoleto. Isso acontece
quando o depurador ainda está executando seu código antigo e não ainda o atualizou com suas alterações. O
depurador abre em pop-up uma caixa de diálogo para informá-lo quando isso acontece. Às vezes, pode ser
necessário pressionar F5 para atualizar o código que está sendo executado. Em particular, se você fizer uma
alteração dentro de uma função enquanto o ponto de execução está dentro daquela função, precisará sair da
função e voltar para ela para obter o código atualizado. Se isso não funcionar por alguma razão e você vir uma
mensagem de erro, você poderá interromper a depuração clicando no quadrado vermelho na barra de
ferramentas abaixo dos menus na parte superior do IDE e iniciar a depuração novamente inserindo F5 ou
escolhendo a seta " reproduzir" verde ao lado do botão Parar na barra de ferramentas.
Feche o aplicativo
Se ele ainda estiver em execução, feche a janela de console para o aplicativo de calculadora.
O aplicativo finalizado
Parabéns! Você concluiu o código para o aplicativo de calculadora e o compilou e depurou no Visual Studio.
Próximas etapas
Saiba mais sobre o Visual Studio para C++
O ponto de partida usual para um programador de C++ é um aplicativo "Olá, mundo!" executado na linha de
comando. É isso que você criará no Visual Studio neste artigo e, em seguida, passaremos para algo mais
desafiador: um aplicativo de calculadora.
Pré-requisitos
tenha Visual Studio com o desenvolvimento de Desktop com a carga de trabalho do C++ instalada e em
execução no seu computador. Se ele ainda não estiver instalado, confira Instalar suporte para C++ no Visual
Studio.
Um aplicativo de console do Windows C++ vazio é criado. Os aplicativos de console usam uma janela de
console do Windows para exibir a saída e aceitar a entrada do usuário. No Visual Studio, uma janela do
editor é aberta e mostra o código gerado:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include "pch.h"
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
2. Para executar o código, na barra de menus, escolha Depurar , Iniciar sem depuração .
Uma janela do console é aberta e, em seguida, executa seu aplicativo. Quando você inicia um aplicativo
de console no Visual Studio, ele é executado em seu código e, em seguida, imprime "Pressione qualquer
tecla para continuar. . ." para dar a oportunidade de ver a saída. Parabéns! Você criou seu primeiro
aplicativo de console "Olá, mundo!" no Visual Studio!
3. Pressione uma tecla para ignorar a janela do console e retornar ao Visual Studio.
Agora você tem as ferramentas para compilar e executar seu aplicativo após cada alteração para verificar se o
código ainda funciona conforme o esperado. Posteriormente, mostraremos como depurá-lo se ele não
funcionar bem.
Editar o código
Agora vamos examinar o código neste modelo em um aplicativo de calculadora.
1. No arquivo CalculatorTutorial.cpp, edite o código para corresponder a este exemplo:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include "pch.h"
#include <iostream>
int main()
{
cout << "Calculator Console Application" << endl << endl;
cout << "Please enter the operation to perform. Format: a+b | a-b | a*b | a/b"
<< endl;
return 0;
}
2. Para salvar o arquivo, insira Ctrl+S ou escolha o ícone Salvar ao lado da parte superior do IDE, o ícone
de disquete na barra de ferramentas na barra de menus.
3. Para executar o aplicativo, pressione CTRL+F5 ou vá para o menu Depurar e escolha Iniciar Sem
Depuração . Se você receber um pop-up com a mensagem Este projeto está desatualizado , você
poderá selecionar Não mostrar esta caixa de diálogo novamente e, em seguida, escolher Sim para
compilar seu aplicativo. Você deve ver uma janela do console em exibição com o texto especificado no
código.
Agora você deve ter três guias abertas no editor: CalculatorTutorial.cpp, Calculator.h e Calculator.cpp. Se
você fechar acidentalmente uma delas, poderá reabri-la clicando duas vezes na janela Gerenciador de
Soluções janela.
2. Em Calculator.h , remova as linhas Calculator(); e ~Calculator(); que foram geradas, já que você não
precisa delas aqui. Em seguida, adicione a seguinte linha de código para que o arquivo agora tenha esta
aparência:
#pragma once
class Calculator
{
public:
double Calculate(double x, char oper, double y);
};
Compreender o código
A linha que você adicionou declara uma nova função chamada Calculate , que usaremos para
executar operações matemáticas para adição, subtração, multiplicação e divisão.
O código C++ é organizado em arquivos de cabeçalho (.h) e de origem (.cpp). Várias outras
extensões de arquivo têm suporte pelos vários compiladores, mas estes são os principais
conhecer. Funções e variáveis normalmente são declaradas, ou seja, recebem um nome e um tipo,
nos arquivos de cabeçalho, e implementadas ou recebem uma definição nos arquivos de origem.
Para acessar código definido em outro arquivo, você pode usar #include "filename.h" , em que
'filename.h' é o nome do arquivo que declara as variáveis ou funções que você deseja usar.
As duas linhas que você excluiu declararam um construtor e um destruidor para a classe. Para
uma classe simples como essa, o compilador as cria para você e seus usos estão além do escopo
deste tutorial.
É uma boa prática organizar seu código em arquivos diferentes com base no que ele faz, de modo
que seja fácil encontrar o código de que você precisa mais tarde. Em nosso caso, definimos a
classe Calculator separadamente do arquivo que contém a função main() , mas podemos
planejar fazer referência à classe Calculator em main() .
3. Você verá um rabisco verde aparecer sob Calculate . Ocorre porque ainda não definimos a função
Calculate no arquivo .cpp. Passe o mouse sobre a palavra, clique na lâmpada que aparece em pop-up e
escolha criar uma definição de 'Calculate' em Calculator.cpp . Um pop-up será exibido,
possibilitando uma espiada na alteração de código que foi feita em outro arquivo. O código foi
adicionado ao Calculator.cpp.
Atualmente, retorna apenas 0,0. Vamos mudar isso. Pressione Esc para fechar o pop-up.
4. Alterne para o arquivo Calculator.cpp na janela do editor. Remova as seções Calculator() e
~Calculator() (como fez no arquivo .h) e adicione o seguinte código a Calculate() :
#include "pch.h"
#include "Calculator.h"
Compreender o código
A função Calculate consome um número, um operador e um segundo número e, em seguida,
executa a operação solicitada nos números.
A instrução de opção verifica que operador foi fornecido e somente executa o caso que
corresponde a essa operação. O padrão: caso é uma contingência se o usuário digita um operador
que não é aceito, de modo que o programa não seja interrompido. Em geral, é melhor manipular
uma entrada de usuário inválida de uma maneira mais elegante, mas isso está além do escopo
deste tutorial.
A double palavra-chave denota um tipo de número que dá suporte a decimais. Dessa forma, a
calculadora pode lidar com matemática decimal e de inteiros. A função é necessária para sempre
retornar esse número devido ao no início do código (isso indica o tipo de retorno da função), que
é o motivo pelo qual retornamos Calculate 0,0 mesmo no caso double padrão.
O arquivo .h declara a função protótipo, que informa ao compilador antecipadamente quais
parâmetros são necessários e que tipo de retorno esperar dele. O arquivo .cpp tem todos os
detalhes de implementação da função.
Se você compilar e executar o código novamente neste ponto, ele ainda será encerrado depois de perguntar
qual operação executar. Em seguida, você modificará a função main para fazer alguns cálculos.
Para chamar funções de membro da classe Calculadora
1. Agora vamos atualizar a função main em CalculatorTutorial.cpp:
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include "pch.h"
#include <iostream>
#include "Calculator.h"
int main()
{
double x = 0.0;
double y = 0.0;
double result = 0.0;
char oper = '+';
Calculator c;
while (true)
{
cin >> x >> oper >> y;
result = c.Calculate(x, oper, y);
cout << "Result is: " << result << endl;
}
return 0;
}
Compreender o código
Uma vez que os programas C++ sempre começam com a função main() , precisamos chamar o
outro código daí, portanto, uma instrução #include é necessária.
Algumas variáveis iniciais x , y , oper e result são declaradas para armazenar o primeiro
número, o segundo número, o operador e o resultado final, respectivamente. É sempre uma boa
prática fornecer alguns valores iniciais para evitar um comportamento indefinido, o que é feito
aqui.
A linha Calculator c; declara um objeto chamado 'c' como uma instância da classe Calculator .
A classe em si é apenas o blueprint para como as calculadoras funcionam; o objeto é a calculadora
específica que faz os cálculos.
A instrução while (true) é um loop. O código dentro do loop continua sendo executado
repetidamente enquanto a condição em () se aplicar. Como a condição é simplesmente listada
como true , ela é sempre verdadeira, portanto, o loop é executado para sempre. Para fechar o
programa, o usuário deve fechar manualmente a janela do console. Caso contrário, o programa
sempre esperará a nova entrada.
A palavra-chave cin é usada para aceitar a entrada do usuário. Esse fluxo de entrada é inteligente
o suficiente para processar uma linha de texto inserida na janela do console e colocá-la dentro de
cada uma das variáveis listadas, em ordem, supondo que a entrada do usuário corresponda à
especificação necessária. Você pode modificar essa linha para aceitar diferentes tipos de entrada,
por exemplo, mais de dois números, embora a função Calculate() também precise ser atualizada
para lidar com isso.
A expressão c.Calculate(x, oper, y); chama a função Calculate definida anteriormente e
fornece os valores de entrada inseridos. A função retorna um número que é armazenado em
result .
Por fim, result é impresso no console para que o usuário veja o resultado do cálculo.
Depurar o aplicativo
Uma vez que o usuário é livre para digitar qualquer coisa na janela do console, vamos garantir que a
calculadora lide com alguma entrada conforme o esperado. Em vez de executar o programa, vamos depurá-lo
para que seja possível inspecionar o que ele está fazendo em detalhes, passo a passo.
Para executar o aplicativo no depurador
1. Defina um ponto de interrupção na linha result = c.Calculate(x, oper, y); , logo após o usuário ter sido
solicitado a inserir a entrada. Para definir um ponto de interrupção, clique Para fazer isso, clique ao lado
da linha na barra vertical cinza ao longo da borda esquerda da janela do editor. Um ponto vermelho é
exibido.
Agora quando depuramos o programa, ele sempre pausa a execução nessa linha. Já temos uma ideia
superficial de que o programa funciona para casos simples. Como não queremos pausar a execução toda
vez, vamos tornar o ponto de interrupção condicional.
2. Clique com o botão direito do mouse no ponto vermelho que representa o ponto de interrupção e
escolha Condições . Na caixa de edição para a condição, insira (y == 0) && (oper == '/') . Escolha o
botão OK quando tiver terminado. A condição é salva automaticamente.
Agora vamos pausar a execução no ponto de interrupção especificamente se você tentar uma divisão por
0.
3. Para depurar o programa, pressione F5 ou escolha o botão da barra de ferramentas Depurador Local
do Windows que tem um ícone de seta verde. Em seu aplicativo de console, se você digitar algo como
"0-5", o programa se comportará normalmente e continuará em execução. No entanto, se você digitar
"10 / 0", ele fará uma pausa no ponto de interrupção. Você pode até mesmo colocar qualquer número de
espaços entre o operador e os números. cin é inteligente o suficiente para analisar a entrada de modo
adequado.
Para ver todas as variáveis dessa função, alterne para a janela Locais . Na verdade, você pode modificar os
valores dessas variáveis enquanto depura para ver que efeito elas teriam sobre o programa. Neste caso,
podemos deixá-las de lado.
Também é possível apenas focalizar variáveis no código em si para ver seus valores atuais em que a execução
está em pausa momento. Verifique se a janela do editor está em foco clicando nela primeiro.
Parece que o programa está fazendo o que é esperado: ele usa o primeiro número e o divide pelo
segundo. Na linha cout , focalize a variável result ou dê uma olhada result na janela Autos . Você
verá que seu valor está listado como "inf", o que não parece correto, então vamos corrigi-lo. A linha
cout somente gera qualquer valor que esteja armazenado em result , portanto, quando você avança
mais uma linha usando F10 , a janela do console exibe:
Esse resultado acontece porque a divisão por zero é indefinida, portanto, o programa não tem uma
resposta numérica para a operação solicitada.
Para consertar o erro de "dividir por zero"
Vamos tratar da divisão por zero de modo mais simples para que um usuário possa entender o problema.
1. Faça as seguintes alterações a CalculatorTutorial.cpp. (Você pode deixar o programa em execução durante
a edição, graças a um recurso do depurador chamado Editar e Continuar ):
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends
there.
//
#include "pch.h"
#include <iostream>
#include "Calculator.h"
int main()
{
double x = 0.0;
double y = 0.0;
double result = 0.0;
char oper = '+';
Calculator c;
while (true)
{
cin >> x >> oper >> y;
if (oper == '/' && y == 0)
{
cout << "Division by 0 exception" << endl;
continue;
}
else
{
result = c.Calculate(x, oper, y);
}
cout << "Result is: " << result << endl;
}
return 0;
}
2. Agora pressione F5 uma vez. A execução do programa continua até ele precisar pausar para pedir
entrada do usuário. Insira 10 / 0 novamente. Agora, é impressa uma mensagem mais útil. O usuário é
solicitado a fornecer mais entradas e o programa continua em execução normalmente.
NOTE
Quando você edita o código no modo de depuração, há um risco de o código se tornar obsoleto. Isso acontece
quando o depurador ainda está executando seu código antigo e não ainda o atualizou com suas alterações. O
depurador abre em pop-up uma caixa de diálogo para informá-lo quando isso acontece. Às vezes, pode ser
necessário pressionar F5 para atualizar o código que está sendo executado. Em particular, se você fizer uma
alteração dentro de uma função enquanto o ponto de execução está dentro daquela função, precisará sair da
função e voltar para ela para obter o código atualizado. Se isso não funcionar por alguma razão e você vir uma
mensagem de erro, você poderá interromper a depuração clicando no quadrado vermelho na barra de
ferramentas abaixo dos menus na parte superior do IDE e iniciar a depuração novamente inserindo F5 ou
escolhendo a seta " reproduzir" verde ao lado do botão Parar na barra de ferramentas.
Feche o aplicativo
Se ele ainda estiver em execução, feche a janela de console para o aplicativo de calculadora.
O aplicativo finalizado
Parabéns! Você concluiu o código para o aplicativo de calculadora e o compilou e depurou no Visual Studio.
Próximas etapas
Saiba mais sobre o Visual Studio para C++
Projetos C/C++ e sistemas de compilação no Visual
Studio
13/05/2021 • 4 minutes to read
Você pode usar o Visual Studio para editar, compilar e criar qualquer base de código C++ com suporte total ao
IntelliSense sem a necessidade de converter esse código em um projeto do Visual Studio ou compilar com o
conjunto de ferramentas MSVC. Por exemplo, você pode editar um projeto CMake de plataforma cruzada no
Visual Studio em um computador Windows e compilá-lo para Linux usando o g + + em um computador Linux
remoto.
Compilação em C++
Criar um programa em C++ significa compilar o código-fonte de um ou mais arquivos e, em seguida, vincular
esses arquivos em um arquivo executável (. exe), uma biblioteca de carregamento dinâmico (. dll) ou uma
biblioteca estática (. lib).
A compilação básica do C++ envolve três etapas principais:
O pré-processador de C++ transforma todas as definições de #directives e macro em cada arquivo de
origem. Isso cria uma unidade de tradução.
O compilador C++ compila cada unidade de tradução em arquivos de objeto (. obj), aplicando quaisquer
opções de compilador definidas.
O vinculador mescla os arquivos de objeto em um único executável, aplicando as opções de vinculador que
foram definidas.
cl /EHsc hello.cpp
Aqui, o compilador (cl.exe) invoca automaticamente o pré-processador do C++ e o vinculador para produzir o
arquivo de saída final. Para obter mais informações, consulte criando na linha de comando.
Nesta seção
Projetos do Visual Studio
Como criar, configurar e criar projetos C++ no Visual Studio usando seu MSBuild (sistema de compilação
nativa).
Projetos do CMake
Como codificar, compilar e implantar projetos CMake no Visual Studio.
Abrir projetos de pasta
Como usar o Visual Studio para codificar, criar e implantar projetos C++ com base em qualquer sistema de
compilação arbitrário, ou sem nenhum sistema de compilação.
Builds de versão
Como criar e solucionar problemas de builds de versão otimizados para implantação para usuários finais.
Usar o conjunto de ferramentas MSVC da linha de comando
Discute como usar o compilador C/C++ e as ferramentas de compilação diretamente da linha de comando em
vez de usar o IDE do Visual Studio.
Criando DLLs no Visual Studio
Como criar, depurar e implantar DLLs C/C++ (bibliotecas compartilhadas) no Visual Studio.
Walkthrough: Criando e usando uma biblioteca estática
Como criar um arquivo binário . lib .
Criando aplicativos isolados C/C++ e assemblies lado a lado
Descreve o modelo de implantação de aplicativos para Windows Desktop, com base na ideia de aplicativos
isolados e assemblies lado a lado.
Configurar projetos C++ para destinos de 64 bits, x64
Como direcionar o hardware de 64 bits x64 com as ferramentas de Build do MSVC.
Configurar projetos C++ para processadores ARM
Como usar as ferramentas de Build do MSVC para direcionar o hardware ARM.
Otimizando seu código
Como otimizar seu código de várias maneiras, incluindo otimizações guiadas por programa.
Configurando programas para o Windows XP
Como direcionar o Windows XP com as ferramentas de Build do MSVC.
Referência de compilação do C/C++
Fornece links para artigos de referência sobre compilação de programa em C++, opções de compilador e
vinculador, e outras ferramentas de compilação.
Ler e entender o código C++ no Visual Studio
30/07/2021 • 4 minutes to read
O editor de códigos e o IDE do Visual Studio fornecem muitos recursos de codificação. Alguns são exclusivos ao
C++ e outros são essencialmente os mesmos para todas as linguagens Visual Studio. Para obter mais
informações sobre as funcionalidades compartilhadas, confira Escrevendo um código no Editor de Códigos e de
Texto.
Colorização
O Visual Studio colore elementos de sintaxe para diferenciar entre tipos de símbolos, como palavras-chave de
linguagem, nomes de tipos, nomes de variáveis, parâmetros de função, literais de cadeia de caracteres e assim
por diante.
O código não utilizado (como o código em um #if 0) tem uma cor mais esmaecida.
Personalize as cores digitando "Fontes" em Início Rápido e, em seguida, escolhendo Fontes e Cores . Na caixa
de diálogo Fontes e Cores , role a página para baixo até as opções do C/C++ e, em seguida, escolha uma fonte
e/ou uma cor personalizada.
Estrutura de tópicos
Clique com o botão direito do mouse em qualquer lugar em um arquivo de código-fonte e escolha Estrutura
de Tópicos para recolher ou expandir blocos de código e/ou regiões personalizadas, a fim de facilitar a
navegação apenas pelo código de seu interesse. Para obter mais informações, consulte Estrutura de tópicos.
Quando você coloca o cursor na frente de uma chave, '{' ou '}', o editor realça seu equivalente correspondente.
Outras opções de delineamento estão localizadas em Editar > Delineamento no menu principal.
Números de linha
Você pode adicionar números de linha ao seu projeto indo para Ferramentas Opções Editor de Texto Todas as
Linguagens Geral ou pesquisando "número de linhas" com > > > > Início Rápido (Ctrl + Q) . Os números de
linha podem ser definidos para todas as linguagens ou para linguagens específicas, incluindo C++.
O Modo de Mapa da barra de rolagem permite que você role a página e navegue por um arquivo de código
rapidamente sem sair da localização atual. Clique em qualquer lugar no mapa de códigos para ir diretamente
para essa localização.
Para ativar o Modo de Mapa , digite "map" na caixa Início Rápido de pesquisa na barra de ferramentas
principal e escolha Usar o modo de mapa de rolagem . Para obter mais informações, confira Como
acompanhar o código personalizando a barra de rolagem.
Quando o Modo de Mapa estiver desativado, a barra de rolagem ainda realçará as alterações feitas no arquivo.
A cor verde indica as alterações salvas e a cor amarela indica as alterações não salvas.
A dica de ferramenta Informações Rápidas tem um link Pesquisar Online . Vá para Opções de
Ferramentas > > Exibição > C++ do Editor de Texto > para especificar o provedor de pesquisa.
Se houver um erro no código, passe o mouse sobre ele, e as Informações Rápidas exibirão a mensagem de
erro. Encontre também a mensagem de erro na janela Lista de Erros.
Se houver um erro no código, passe o mouse sobre ele, e as Informações Rápidas exibirão a mensagem de
erro. Encontre também a mensagem de erro na janela Lista de Erros .
Quando você chama uma função, a opção Informações de Parâmetro mostra os tipos de parâmetros e a
ordem na qual eles são esperados.
Inspecionar Definição
Passe o mouse sobre uma variável ou uma declaração da função, clique com o botão direito do mouse e, em
seguida, escolha Inspecionar Definição para ver uma exibição embutida de sua definição sem sair da
localização atual. Para obter mais informações, confira Inspecionar Definição (Alt+F12).
Ajuda F1
Posicione o cursor sobre qualquer tipo, palavra-chave ou função ou imediatamente após eles e pressione F1
para ir diretamente para o tópico de referência relevante em docs.microsoft.com. F1 também funciona em itens
da Lista de Erros e em muitas caixas de diálogo.
Exibição de Classe
O Modo de Exibição de Classe exibe um conjunto pesquisável de árvores de todos os símbolos de códigos e
suas hierarquias de pai/filho e escopo, organizadas por projeto. Configure o que o Modo de Exibição de
Classe exibe em Configurações do Modo de Exibição de Classe (clique no ícone da caixa de engrenagem
na parte superior da janela).
Há várias categorias amplas de aplicativos do Windows que você pode criar com o C++. Cada uma tem seu
próprio modelo de programação e conjunto de bibliotecas específicas do Windows, mas a biblioteca c++
Standard e bibliotecas de C++ de terceiros podem ser usadas em qualquer uma delas.
Esta seção discute como usar o Visual Studio e as bibliotecas de wrapper MFC/ATL para criar programas do
Windows. Para obter a documentação sobre a própria plataforma Windows, consulte a documentação do
Windows.
Componentes COM
O Component Object Model (COM) é uma especificação que permite que programas escritos em linguagens
diferentes se comuniquem entre si. Muitos componentes do Windows são implementados como objetos COM e
seguem regras COM padrão para criação de objeto, descoberta de interface e destruição de objeto. Usar objetos
COM de aplicativos da área de trabalho do C++ é relativamente simples, mas escrever seu próprio objeto COM
é mais avançado. O Active Template Library (ATL) fornece macros e funções auxiliares que simplificam o
desenvolvimento COM. Para obter mais informações, consulte Componentes da área de trabalho COM da ATL.
Ponte de Desktop
No Windows 10, você pode empacotar seu aplicativo de área de trabalho existente ou objeto COM como um
aplicativo UWP e adicionar recursos UWP, como toque, ou chamar APIs do conjunto de API do Windows
moderno. Você também pode adicionar um aplicativo UWP a uma solução de desktop no Visual Studio e
empacotá-los juntos em um único pacote e usar APIs do Windows para se comunicar entre eles.
O Visual Studio 2017 versão 15,4 e posterior permite que você crie um projeto de pacote de aplicativos do
Windows para simplificar bastante o trabalho de empacotamento de seu aplicativo de área de trabalho
existente. Algumas restrições se aplicam às chamadas de registro ou APIs que seu aplicativo de desktop pode
usar. No entanto, em muitos casos, você pode criar caminhos de código alternativos para obter uma
funcionalidade semelhante durante a execução em um pacote de aplicativo. Para saber mais, veja Ponte de
Desktop.
Jogos
Os jogos do DirectX podem ser executados no PC ou no Xbox. Para obter mais informações, consulte elementos
gráficos do DirectX e jogos.
Ferramentas de desenvolvimento
O Visual Studio inclui um depurador potente para código nativo, ferramentas de análise estática, ferramentas de
depuração gráfica, um editor de código com recursos completos, suporte para testes de unidade e muitos
outros utilitários e ferramentas. Para obter mais informações, consulte Get started developing with Visual
Studioe Overview of C++ development in Visual Studio.
Nesta seção
T ÍT ULO DESC RIÇ Ã O
Passo a passo: criando um programa C++ padrão Crie um aplicativo de console do Windows.
Passo a passo: criando aplicativos da área de trabalho do Crie um aplicativo nativo da área de trabalho do Windows.
Windows (C++)
Assistente de Área de Trabalho do Windows Use o assistente para criar novos projetos do Windows.
ATL (Active Template Library) Use a biblioteca do ATL para criar componentes COM em
C++.
MFC (Microsoft Foundation Classes) Use o MFC para criar aplicativos grandes ou pequenos do
Windows com caixas de diálogo e controles
Classes compartilhadas ATL e MFC Use classes como CString que são compartilhadas em ATL e
MFC.
Trabalhando com arquivos de recurso Como adicionar imagens, ícones, tabelas de cadeia de
caracteres e outros recursos a um aplicativo de área de
trabalho.
Recursos para criar um jogo usando DirectX (C++) Links para conteúdo para criar jogos em C++.
Como: usar o SDK do Windows 10 em um aplicativo de área Contém etapas para configurar seu projeto para criar
de trabalho do Windows usando o SDK do Windows 10.
Como implantar aplicativos da área de trabalho nativos Implante aplicativos nativos no Windows.
Artigos relacionados
T ÍT ULO DESC RIÇ Ã O
C++ no Visual Studio Tópico pai para conteúdo do Visual C++ Developer.
Desenvolvimento do .NET com C++/CLI Crie wrappers para bibliotecas C++ nativas que permitem a
comunicação com aplicativos e componentes .NET.
Extensões de componente para .NET e UWP Referência para elementos de sintaxe compartilhados por
C++/CX e C++/CLI.
Aplicativos universais do Windows (C++) Grave aplicativos UWP usando C++/CX ou WRL (biblioteca
de modelos do Windows Runtime).
T ÍT ULO DESC RIÇ Ã O
Atributos C++ para COM e .NET Atributos não padrão para programação somente do
Windows usando .NET ou COM.
Aplicativos universais do Windows (C++)
13/05/2021 • 2 minutes to read
O Plataforma Universal do Windows (UWP) é a interface de programação moderna para o Windows. Com o
UWP, você escreve um aplicativo ou componente uma vez e o implanta em qualquer dispositivo Windows 10.
Você pode escrever um componente em C++ e os aplicativos escritos em qualquer outra linguagem compatível
com UWP podem usá-lo.
A maior parte da documentação do UWP está na árvore de conteúdo do Windows na documentação plataforma
universal do Windows. Lá, você encontrará tutoriais de início, bem como documentação de referência.
Para novos aplicativos e componentes UWP, recomendamos que você use C++/WinRT, uma nova projeção de
linguagem c++ 17 padrão para APIs de Windows Runtime. O C++/WinRT está disponível no SDK do Windows
10 da versão 1803 em diante. O C++/WinRT é implementado inteiramente em arquivos de cabeçalho e foi
projetado para fornecer a você acesso de primeira classe à API moderna do Windows. Diferentemente da
implementação do C++/CX, o C++/WinRT não usa sintaxe não padrão nem extensões de linguagem da
Microsoft, e aproveita totalmente o compilador C++ para criar uma saída altamente otimizada. Para obter mais
informações, consulte introdução ao C++/WinRT.
Você pode usar o conversor de aplicativo de ponte de área de trabalho para empacotar seu aplicativo de área de
trabalho existente para implantação por meio do Microsoft Store. Para obter mais informações, consulte Using
Visual C++ Runtime in Centennial Project and Desktop Bridge.
Quando você cria um jogo do Windows 10, tem a oportunidade de alcançar milhões de jogadores em todo
mundo no celular, computador e Xbox One. Com o Xbox no Windows, o Xbox Live, multijogadores entre
dispositivos, uma incrível comunidade de jogos e os novos recursos avançados como a UWP (Plataforma
Universal do Windows) e o DirectX 12, os jogos do Windows 10 emocionam jogadores de todas as idades e
gêneros. A nova UWP (Plataforma Universal do Windows) oferece compatibilidade para seu jogo entre
dispositivos Windows 10 com uma API comum para celular, computador e Xbox One, juntamente com
ferramentas e opções para ajustar seu jogo a cada experiência do dispositivo.
O desenvolvimento de jogos está documentado no Centro de Desenvolvimento do Windows.
Programação do .NET com C++/CLI
13/05/2021 • 2 minutes to read
Por padrão, os projetos CLR criados com o Visual Studio 2015 de destino .NET Framework 4.5.2. Você pode
direcionar .NET Framework 4,6 ao criar um novo projeto. Na caixa de diálogo novo projeto , altere a estrutura
de destino na lista suspensa na parte superior da caixa de diálogo. Para alterar a estrutura de destino de um
projeto existente, feche o projeto, edite o arquivo de projeto ( .vcxproj ) e altere o valor da versão do
Framework de destino para 4,6. As alterações entrarão em vigor na próxima vez que você abrir o projeto.
No Visual Studio 2017, o .NET Framework de destino padrão é 4.6.1. O seletor de versão do Framework está na
parte inferior da caixa de diálogo novo projeto .
Nesta seção
Tarefas do C++/CLI
Interoperabilidade .NET e nativa
Código puro e verificável (C++/CLI)
Expressões regulares (C++/CLI)
Manipulação de arquivos e e/s (C++/CLI)
Operações de gráficos (C++/CLI)
Operações do Windows (C++/CLI)
Acesso a dados usando ADO.NET (C++/CLI)
Interoperabilidade com outras linguagens .NET (C++/CLI)
Serialização (C++/CLI)
Tipos gerenciados (C++/CLI)
Reflexão (C++/CLI)
Assemblies de nome forte (assinatura de assembly) (C++/CLI)
Classe de depuração (C++/CLI)
Referência de biblioteca STL/CLR
Biblioteca de suporte do C++
Exceções em C++/CLI
Conversão boxing (C++/CLI)
Confira também
Interoperabilidade .NET e nativa
Nuvem e programação da Web no Visual C++
13/05/2021 • 2 minutes to read
Veja também
C++ no Visual Studio
Central de Desenvolvedores do Microsoft Azure C e C++
Redes e serviços Web (UWP)
Guia de atualização e portabilidade do Microsoft
C++
13/05/2021 • 3 minutes to read
Este artigo fornece um guia para atualizar o código do Microsoft C++ para a versão mais recente do Visual
Studio. Para projetos criados no Visual Studio 2010 até 2017, basta abrir o projeto no Visual Studio 2019. Você
pode atualizar um projeto do Visual Studio 2008 ou anterior em duas etapas. Use o Visual Studio 2010 para
converter o projeto para o formato MSBuild primeiro. Em seguida, abra o projeto no Visual Studio 2019. Para
obter instruções completas, consulte Atualizando projetos C++ de versões anteriores do Visual Studio.
Os conjuntos de ferramentas no Visual Studio 2015, Visual Studio 2017 e Visual Studio 2019 são compatíveis
com binários. Agora você pode atualizar para uma versão mais recente do compilador sem precisar atualizar
suas dependências de biblioteca. Para obter mais informações, consulte compatibilidade binária de C++ 2015-
2019.
Ao atualizar projetos que usam bibliotecas de software livre ou que devem ser executados em várias
plataformas, recomendamos migrar para um projeto baseado em CMake. Para obter mais informações, consulte
projetos do cmake no Visual Studio
Nesta seção
T ÍT ULO DESC RIÇ Ã O
Atualizando projetos C++ de versões anteriores do Visual Como atualizar sua base de código para o Visual Studio
Studio 2019 e v142 do compilador.
Ferramentas IDE para atualizar o código C++ Recursos de IDE úteis que ajudam no processo de
atualização.
Compatibilidade binária de C++ 2015-2019 Consuma bibliotecas v140 e v141 no estado em que se
encontram de projetos v142.
Usar multiplataforma nativa no Visual Studio para compilar Use o Visual Studio 2019 com compiladores e bibliotecas
projetos antigos mais antigos.
Histórico de alterações de 2003 a 2015 do Visual C++ Uma lista de todas as alterações nas bibliotecas do Microsoft
C++ e ferramentas de compilação do Visual Studio 2003 até
2015 que podem exigir alterações no seu código.
O que há de novo no Visual C++ de 2003 até 2015 Todas as informações de "novidades" do Microsoft C++ do
Visual Studio 2003 por meio do Visual Studio 2015.
Portabilidade e atualização: exemplos e estudos de caso Nessa seção, portamos e atualizamos vários exemplos e
aplicativos e discutimos as experiências e os resultados. Esses
artigos oferecem uma noção do que está envolvido no
processo de portabilidade e atualização. Durante o processo,
discutimos a respeito de dicas e truques para a atualização e
mostramos como erros específicos foram corrigidos.
Portabilidade para a Plataforma Universal do Windows Contém informações sobre como fazer portabilidade de
código para o Windows 10
Introdução ao Visual C++ para usuários do UNIX Fornece informações para usuários do UNIX novatos no
Visual C++ e que desejam tornar-se produtivos com ele.
Como executar programas do Linux no Windows Discute as opções para migrar aplicativos UNIX para o
Windows.
Veja também
C++ no Visual Studio
Novidades do compilador C++ no Visual Studio
Aprimoramentos de conformidade do C++ no Visual Studio
Práticas recomendadas de segurança para C++
13/05/2021 • 4 minutes to read
Este artigo contém informações sobre ferramentas e práticas de segurança. Elas não tornam os aplicativos
imunes a ataques, mas diminuem a probabilidade de ataques bem-sucedidos.
Biblioteca de SafeInt
A biblioteca SafeInt ajuda a evitar estouros inteiros e outros erros exploráveis que podem ocorrer quando o
aplicativo executa operações matemáticas. A SafeInt biblioteca inclui a classe SafeInt, a classe
SafeIntExceptione várias funções SafeInt.
A classe de SafeInt protege contra explorações de estouro de inteiro e de divisão por zero. Você pode usá-la
para tratar comparações entre valores de tipos diferentes. Ele fornece duas políticas de tratamento de erros. A
política padrão é que a classe SafeInt lance uma exceção da classe SafeIntException para relatar por que uma
operação matemática não pode ser concluída. A segunda política é que a classe SafeInt interrompa a execução
do programa. Você também pode definir uma política personalizada.
Cada função de SafeInt protege uma operação matemática contra um erro explorável. Você pode usar dois
tipos diferentes de parâmetros sem convertê-los no mesmo tipo. Para proteger várias operações matemáticas,
use a classe SafeInt .
Iteradores verificados
Um iterador verificado impõe limites do contêiner. Por padrão, quando um iterador verificado está fora dos
limites, ele gera uma exceção e finaliza a execução do programa. Um iterador verificado fornece outros níveis de
resposta que dependem de valores que são atribuídos a definições de pré-processador, como
_SECURE_SCL_THROWS e _ITERATOR_DEBUG_LEVEL . Por exemplo, em _ITERATOR_DEBUG_LEVEL=2 , um iterador
verificado fornece verificações de exatidão abrangentes no modo de depuração, que são disponibilizadas
usando declarações. Para obter mais informações, consulte iteradores marcados e _ITERATOR_DEBUG_LEVEL .
Veja também
System.Security
Security
Como o UAC (controle de conta de usuário) afeta seu aplicativo
Executando como um membro do grupo de
usuários
13/05/2021 • 2 minutes to read
Este tópico explica como a configuração de contas de usuário do Windows como membro do grupo Usuários
(em vez do grupo Administradores) aumenta a segurança reduzindo as chances de contaminação com código
mal-intencionado.
Riscos à segurança
A execução como administrador torna o sistema vulnerável a vários tipos de ataque de segurança, como
"cavalos de Troia" e "estouro de buffer". Uma simples visita a um site da Internet como administrador pode ser
danoso ao sistema, pois o código mal-intencionado que é baixado de um site da Internet pode atacar o
computador. Se ele for bem-sucedido, herdará as suas permissões de administrador e poderá executar ações
como excluir todos os arquivos, reformatar o disco rígido e criar novas contas de usuário com acesso
administrativo.
Depuração
Você pode depurar todos os aplicativos que iniciar no Visual Studio (nativos e não gerenciados) como não
administrador tornando-se parte do grupo Depuração. Isso inclui a capacidade de anexar a um aplicativo em
execução usando o comando Anexar ao Processo. No entanto, é necessário fazer parte do grupo Administrador
para depurar aplicativos nativos ou gerenciados iniciados por um usuário diferente.
Veja também
Práticas recomendadas de segurança
Como o Controle de Conta de Usuário (UAC) afeta
o aplicativo
30/07/2021 • 2 minutes to read
O UAC (Controle de Conta de Usuário) é um recurso do Windows Vista no qual as contas de usuário têm
privilégios limitados. Você pode encontrar informações detalhadas sobre o UAC nestes sites:
Práticas recomendadas e diretrizes para aplicativos em um ambiente com privilégios mínimos
unsigned char ReadByte(unsigned char *buffer, unsigned int buffer_size, unsigned int untrusted_index) {
if (untrusted_index < buffer_size) {
unsigned char value = buffer[untrusted_index];
return shared_buffer[value * 4096];
}
}
Neste exemplo, ReadByte é fornecido um buffer, um tamanho de buffer e um índice nesse buffer. O parâmetro
de índice, conforme especificado por untrusted_index , é fornecido por um contexto menos privilegiado, como
um processo não administrativo. Se untrusted_index for menor que buffer_size , o caractere nesse índice será
lido buffer e usado para indexar em uma região compartilhada de memória referenciada por shared_buffer .
Do ponto de vista da arquitetura, essa sequência de código é perfeitamente segura, pois é garantido que
untrusted_index será sempre menor que buffer_size . No entanto, na presença de execução especulativa, é
possível que a CPU faça uma previsão incorreta da ramificação condicional e execute o corpo da instrução If
mesmo quando untrusted_index for maior ou igual a buffer_size . Como consequência disso, a CPU pode,
especulativamente, ler um byte de além dos limites de buffer (que poderia ser um segredo) e, em seguida,
usar esse valor de byte para computar o endereço de uma carga subsequente por meio do shared_buffer .
Embora a CPU eventualmente detecte esse erro de previsão, os efeitos colaterais podem ser deixados no cache
da CPU que revela informações sobre o valor de byte que foi lido dos limites de buffer . Esses efeitos colaterais
podem ser detectados por um contexto menos privilegiado em execução no sistema, investigando a rapidez
com que cada linha de cache shared_buffer é acessada. As etapas que podem ser executadas para fazer isso
são:
1. Invocar ReadByte várias vezes com untrusted_index menos de buffer_size . O contexto de ataque
pode fazer com que o contexto da vítima invoque ReadByte (por exemplo, via RPC), de modo que o
Predictor da ramificação seja treinado para não ser levado como untrusted_index é menor que
buffer_size .
2. Libere todas as linhas de shared_buffer cache no . O contexto de ataque deve liberar todas as linhas
de cache na região compartilhada da memória referenciada por shared_buffer . Como a região de
memória é compartilhada, isso é simples e pode ser feito usando intrínsecos, como _mm_clflush .
3. Invocar ReadByte com untrusted_index ser maior buffer_size que . O contexto de ataque faz com
que o contexto da vítima seja invocado ReadByte , de modo que ele prevê incorretamente que a
ramificação não será executada. Isso faz com que o processador execute especulativamente o corpo do
bloco If com untrusted_index um maior que buffer_size , o que leva a uma leitura fora dos limites de
buffer . Consequentemente, shared_buffer é indexado usando um valor potencialmente secreto que foi
lido fora dos limites, fazendo com que a respectiva linha de cache seja carregada pela CPU.
4. Leia cada linha de cache shared_buffer para ver qual é acessado mais rapidamente . O contexto
de ataque pode ler cada linha de cache no shared_buffer e detectar a linha de cache que carrega
significativamente mais rápido do que as outras. Essa é a linha de cache que provavelmente foi
apresentada pela etapa 3. Como há uma relação de 1:1 entre o valor de byte e a linha de cache neste
exemplo, isso permite que o invasor inferir o valor real do byte que foi lido fora dos limites.
As etapas acima fornecem um exemplo de como usar uma técnica conhecida como liberação + recarga em
conjunto com a exploração de uma instância de CVE-2017-5753.
L IM IT E DE C O N F IA N Ç A DESC RIÇ Ã O
Os aplicativos que têm a superfície de ataque exposta a qualquer um dos limites de confiança acima devem
revisar o código na superfície de ataque para identificar e atenuar possíveis instâncias de vulnerabilidades de
canal lateral de execução especulativa. Deve-se observar que os limites de confiança expostos a superfícies de
ataque remoto, como protocolos de rede remota, não foram demonstrados como risco de vulnerabilidades de
canal lateral de execução especulativa.
unsigned char ReadByte(unsigned char *buffer, unsigned int buffer_size, unsigned int untrusted_index) {
if (untrusted_index < buffer_size) {
// SPECULATION BARRIER
unsigned char value = buffer[untrusted_index];
return shared_buffer[value * 4096];
}
}
Da mesma forma, uma carga fora dos limites da matriz pode ocorrer em conjunto com um loop que exceda sua
condição de encerramento devido a uma previsão incorreta. Neste exemplo, a ramificação condicional associada
à x < buffer_size expressão pode prever incorretamente e executar de forma especulativa o corpo do for
loop quando x é maior ou igual a buffer_size , resultando, assim, em uma carga de fora dos limites
especulativo.
#define MAX_MESSAGE_ID 16
void DispatchMessage(unsigned int untrusted_message_id, unsigned char *buffer, unsigned int buffer_size) {
if (untrusted_message_id < MAX_MESSAGE_ID) {
// SPECULATION BARRIER
DispatchTable[untrusted_message_id](buffer, buffer_size);
}
}
Assim como no caso de uma carga fora dos limites da matriz alimentar outra carga, essa condição também
pode surgir em conjunto com um loop que exceda sua condição de encerramento devido a uma previsão
incorreta.
Armazenamento fora de limites de matriz alimentando uma ramificação indireta
Enquanto o exemplo anterior mostrou como uma carga fora de limites restritos pode influenciar um destino de
ramificação indireta, também é possível para um armazenamento fora de limites para modificar um destino de
ramificação indireta, como um ponteiro de função ou um endereço de retorno. Isso pode potencialmente levar à
execução especulativa de um endereço especificado pelo invasor.
Neste exemplo, um índice não confiável é passado pelo untrusted_index parâmetro. Se untrusted_index for
menor que a contagem de elementos da pointers matriz (256 elementos), o valor de ponteiro fornecido em
ptr será gravado na pointers matriz. Esse código é seguro em termos de segurança, mas se a CPU previr
incorretamente a ramificação condicional, isso poderá resultar na ptr escrita especulativa dos limites da matriz
alocada na pilha pointers . Isso pode levar à corrupção especulativa do endereço de retorno para WriteSlot .
Se um invasor puder controlar o valor de ptr , ele poderá causar a execução especulativa de um endereço
arbitrário quando WriteSlot retornar ao longo do caminho especulativo.
Da mesma forma, se uma variável local de ponteiro de função tiver func sido alocada na pilha, poderá ser
possível modificar especulativamente o endereço que func se refere quando a previsão de ramificação
condicional ocorrer. Isso pode resultar na execução especulativa de um endereço arbitrário quando o ponteiro
de função é chamado por meio de.
unsigned char WriteSlot(unsigned int untrusted_index, void *ptr) {
void *pointers[256];
void (*func)() = &callback;
if (untrusted_index < 256) {
// SPECULATION BARRIER
pointers[untrusted_index] = ptr;
}
func();
}
Deve-se observar que esses dois exemplos envolvem a modificação especulativa de ponteiros de ramificação
indiretos alocados para pilha. É possível que a modificação especulativa também possa ocorrer para variáveis
globais, memória alocada para heap e até mesmo memória somente leitura em algumas CPUs. Para a memória
alocada para pilha, o compilador do Microsoft C++ já usa etapas para tornar mais difícil modificar de forma
especulativa os destinos de ramificação indiretos alocados na pilha, como reordenar variáveis locais, de forma
que os buffers sejam colocados adjacentes a um cookie de segurança como parte do /GS recurso de segurança
do compilador.
class CBaseType {
public:
CBaseType(TypeName type) : type(type) {}
TypeName type;
};
obj2->dispatch_routine();
return obj2->field2;
}
}
unsigned char ReadByte(unsigned char *buffer, unsigned int buffer_size, unsigned int trusted_index) {
unsigned int index;
// SPECULATION BARRIER
unsigned char value = buffer[index];
return shared_buffer[value * 4096];
}
#define MAX_MESSAGE_ID 16
void DispatchMessage(unsigned int untrusted_message_id, unsigned char *buffer, unsigned int buffer_size) {
MESSAGE_ROUTINE routine;
// SPECULATION BARRIER
routine(buffer, buffer_size);
}
Opções de mitigação
As vulnerabilidades do canal lateral de execução especulativa podem ser atenuadas fazendo alterações no
código-fonte. Essas alterações podem envolver a mitigação de instâncias específicas de uma vulnerabilidade,
como adicionar uma barreira de especulação ou fazer alterações no design de um aplicativo para tornar as
informações confidenciais inacessíveis à execução especulativa.
Barreira de especulação via instrumentação manual
Uma barreira de especulação pode ser inserida manualmente por um desenvolvedor para impedir que a
execução especulativa continue em um caminho de não-arquitetura. Por exemplo, um desenvolvedor pode
inserir uma barreira de especulação antes de um padrão de codificação perigoso no corpo de um bloco
condicional, seja no início do bloco (após a ramificação condicional) ou antes da primeira carga que for
preocupante. Isso impedirá que uma previsão de ramificação condicional execute o código perigoso em um
caminho que não seja de arquitetura ao serializar a execução. A sequência de barreira de especulação difere pela
arquitetura de hardware, conforme descrito pela tabela a seguir:
Por exemplo, o seguinte padrão de código pode ser mitigado usando o _mm_lfence intrínseco, conforme
mostrado abaixo.
// A pointer to a shared memory region of size 1MB (256 * 4096)
unsigned char *shared_buffer;
unsigned char ReadByte(unsigned char *buffer, unsigned int buffer_size, unsigned int untrusted_index) {
if (untrusted_index < buffer_size) {
_mm_lfence();
unsigned char value = buffer[untrusted_index];
return shared_buffer[value * 4096];
}
}
unsigned char ReadByte(unsigned char *buffer, unsigned int buffer_size, unsigned int untrusted_index) {
if (untrusted_index < buffer_size) {
untrusted_index &= (buffer_size - 1);
unsigned char value = buffer[untrusted_index];
return shared_buffer[value * 4096];
}
}
Veja também
Diretrizes para atenuar as vulnerabilidades de canal lateral de execução especulativa
Atenuando vulnerabilidades de hardware de canal lateral de execução especulativa
Referência de bibliotecas padrão e da linguagem
C/C++
13/05/2021 • 2 minutes to read
Esta seção da documentação contém o conteúdo de referência para a implementação da Microsoft das
linguagens ISO Standard C e C++. A referência de linguagem inclui documentação para o pré-processador,
intrínsecos do compilador e linguagens de assembly com suporte.
Você também encontrará documentação para a biblioteca de tempo de execução C, a biblioteca padrão C++ e
várias outras bibliotecas disponíveis com o compilador C/C++ da Microsoft (MSVC) aqui.
Referência de linguagem
Linguagem C
Conteúdo de referência para a implementação da Microsoft da linguagem C.
Linguagem C++
Conteúdo de referência para a implementação da Microsoft da linguagem C++.
Pré-processador de C/C++
Conteúdo de referência para o pré-processador usado por C e C++.
Intrínsecos do compilador
Descreve as funções intrínsecas que estão disponíveis no Microsoft C e C++ para arquiteturas x86, ARM,
ARM64 e x64.
Assembler embutido
Explica como usar o assembler embutido do Visual C/C++ com processadores x86.
Referência do ARM Assembler
Fornece material de referência para o Microsoft ARM assembler (ARMASM) e ferramentas relacionadas.
Referência do Microsoft Macro Assembler
Fornece material de referência para o Microsoft Macro Assembler (MASM).
Referência de bibliotecas
Bibliotecas padrão
Biblioteca de tempo de execução C
A referência para a implementação da Microsoft da biblioteca de tempo de execução C (CRT), às vezes chamada
de CRT universal.
Biblioteca padrão do C++
A referência para a implementação da Microsoft da biblioteca padrão C++.
Bibliotecas para aplicativos do Windows
MFC/ATL
Documentação para as bibliotecas de classes MFC (MFC) e Active Template Library (ATL).
Bibliotecas adicionais
C++ AMP (C++ Accelerated Massive Parallelism)
Classes que permitem o uso de processadores gráficos modernos para programação de uso geral.
Tempo de Execução de Simultaneidade
Classes que simplificam a gravação de programas que usam paralelismo de dados ou paralelismo de tarefas.
OpenMP
Referência para a implementação da API de OpenMP da Microsoft.
Biblioteca SafeInt
Uma biblioteca portátil que pode ser usada com MSVC, GCC ou clang para ajudar a evitar estouros inteiros.
Bibliotecas de acesso a dados Bibliotecas para dar suporte ao acesso a dados usando ATL ou MFC e serviços
herdados, como OLE DB e ODBC.
Artigos relacionados
Windows Runtime (WinRT) com C++
O C++/WinRT é uma linguagem C++17 moderna e inteiramente padrão para APIs do Windows Runtime
(WinRT), implementada como uma biblioteca com base em arquivo e cabeçalho.
Windows Runtime WRL (biblioteca de modelos C++)
Uma biblioteca de modelos herdada para a Windows Runtime, substituída por C++/WinRT.
Idiomas
13/05/2021 • 2 minutes to read
Linguagem C
Linguagem C++
Pré-processador de C/C++
Intrínsecos do compilador e linguagem do assembly
Referência da linguagem C
13/05/2021 • 2 minutes to read
Veja também
Referência da linguagem C++
Referência da linguagem C++
13/05/2021 • 2 minutes to read
Essa referência explica a linguagem de programação C++, conforme implementada no compilador do Microsoft
C++. A organização se baseia no manual de referência do C++ anotado por Margaret Ellis e Bjarne Stroustrup e
no padrão ISO/ISO C++ (c/IEC FDIS 14882). As implementações específicas da Microsoft de recursos da
linguagem C++ são incluídas.
Para obter uma visão geral das práticas de programação C++ modernas, consulte Bem-vindo de volta ao C++.
Consulte as tabelas a seguir para localizar rapidamente uma palavra-chave ou um operador:
Palavras-chave do C++
Operadores do C++
Nesta seção
Convenções léxicas
Elementos lexicais fundamentais de um programa C++: tokens, comentários, operadores, palavras-chave,
pontuadores, literais. Além disso, conversão de arquivo, precedência/associatividade de operadores.
Conceitos básicos
Escopo, vínculo, inicialização e encerramento do programa, classes de armazenamento e tipos.
Tipos internos Os tipos fundamentais que são criados no compilador C++ e seus intervalos de valor.
Conversões padrão
Conversões de tipo entre tipos internos. Além disso, conversões aritméticas e conversões entre ponteiro,
referência e tipos de ponteiro a membro.
Declarações e definições Declarando e Definindo variáveis, tipos e funções.
Operadores, precedência e capacidade de associação
Os operadores em C++.
Expressões
Tipos de expressões, semântica de expressões, tópicos de referência sobre operadores, conversão e operadores
de conversão, informações de tipo de tempo de execução.
Expressões lambda
Uma técnica de programação que define implicitamente uma classe de objeto de função e constrói um objeto
de função desse tipo de classe.
Instruções
Expressão, nulo, composto, seleção, iteração, salto e instruções de declaração.
Classes e structs
Introdução a classes, estruturas e uniões. Além disso, funções de membro, funções de membro especiais,
membros de dados, campos de bits, this ponteiros, classes aninhadas.
Uniões
Tipos definidos pelo usuário em que todos os membros compartilham o mesmo local de memória.
Classes derivadas
Herança única e múltipla, virtual funções, várias classes base, classes abstratas , regras de escopo. Além
disso, __super as __interface palavras-chave e.
Controle de acesso de membros
Controlando o acesso a membros de classe: public , private ,e protected palavras-chave. Funções e classes
amigas.
Sobrecarga
Operadores sobrecarregados, regras para sobrecarga de operador.
Tratamento de Exceção
Tratamento de exceções C++, SEH (manipulação de exceção estruturada), palavras-chave usadas na escrita de
instruções de tratamento de exceções.
Asserção e User-Supplied mensagens
#error a diretiva, a static_assert palavra-chave, a assert macro.
Modelos
Especificações de modelo, modelos de função, modelos de classe, typename palavra-chave, modelos vs. macros,
modelos e ponteiros inteligentes.
Manipulação de eventos
Eventos de declaração e manipuladores de eventos.
Modificadores específicos da Microsoft
Modificadores específicos do Microsoft C++. Endereçamento de memória, convenções de chamada, naked
funções, atributos de classe de armazenamento estendido ( __declspec ), __w64 .
Assembler embutido
Usando linguagem de assembly e C++ em __asm blocos.
Suporte a COM do compilador
Uma referência a classes específicas da Microsoft e funções globais usadas para oferecer suporte a tipos COM.
Extensões da Microsoft
Extensões da Microsoft para C++.
Comportamento não padrão
Informações sobre o comportamento não padrão do compilador do Microsoft C++.
Bem-vindo outra vez ao C++
Uma visão geral das práticas de programação C++ modernas para escrever programas seguros, corretos e
eficientes.
Seções relacionadas
Extensões de componentes para plataformas de runtime
Material de referência sobre como usar o compilador do Microsoft C++ para o .NET de destino.
Referência de build C/C++
Opções do compilador, opções de vinculador e outras ferramentas de compilação.
Referência de pré-processador do C/C++
Material de referência sobre pragmas, diretivas de pré-processador, macros predefinidas e o pré-processador.
Bibliotecas do Visual C++
Uma lista de links para as páginas de início de referência para as várias bibliotecas do Microsoft C++.
Veja também
Referência da linguagem C
Referência de pré-processador C/C++
13/05/2021 • 2 minutes to read
Nesta seção
Pré-processador
Fornece uma visão geral dos pré-processadores de conformidade tradicionais e novos.
Diretivas de pré-processador
Descreve as políticas, normalmente usadas para tornar os programas de origem fáceis de alterar e de compilar
em ambientes de execução diferentes.
Operadores de pré-processador
Discute os quatro operadores específicos de pré-processadores usados no contexto da política #define .
Macros predefinidas
Discute macros predefinidas conforme especificado pelos padrões C e C++ e pelo Microsoft C++.
Pragmas
Discute pragmas, que proporcionam uma maneira para que cada compilador ofereça recursos específicos de
máquinas e sistemas operacionais enquanto mantém a compatibilidade geral com as linguagens C e C++.
Seções relacionadas
Referência da linguagem C++
Fornece o material de referência para a implementação da Microsoft da linguagem C++.
Referência da linguagem C
Fornece o material de referência para a implementação da Microsoft da linguagem C.
Referência de Build do C/C++
Fornece links para tópicos que discutem opções de compilador e de vinculador.
Projetos do Visual Studio – C++
Descreve a interface do usuário no Visual Studio que permite especificar os diretórios que o sistema do projeto
procurará para localizar arquivos para o seu projeto do C++.
Intrínsecos do compilador e linguagem assembly
13/05/2021 • 2 minutes to read
Artigos relacionados
T ÍT ULO DESC RIÇ Ã O
A maioria das funções está contidas em bibliotecas, mas algumas funções são internas (ou seja, intrínsecas) para
o compilador. Elas são chamadas de funções intrínsecas ou intrínsecos.
Comentários
Se uma função for um intrínseco, o código para essa função será inserido geralmente embutido, evitando a
sobrecarga de uma chamada de função e permitindo que instruções de máquina altamente eficientes sejam
emitidas para a função. Um intrínseco geralmente é mais rápido do que o assembly embutido equivalente,
porque o otimizador tem conhecimento interno de quantos intrínsecos se comportam, algumas otimizações
que podem estar disponíveis não estarão disponíveis quando o assembly embutido for usado. Além disso, o
otimizador pode expandir o intrínseco diferentemente, alinhar buffers de forma diferente ou fazer outros ajustes
dependendo do contexto e dos argumentos da chamada.
O uso de intrínsecos afeta a portabilidade do código, pois os intrínsecos que estão disponíveis no Visual C++
podem não estar disponíveis se o código for compilado com outros compiladores, e alguns intrínsecos que
podem estar disponíveis para algumas arquiteturas de destino não estarão disponíveis para todas as
arquiteturas. No entanto, intrínsecos são geralmente mais portáteis do que o assembly embutido. Os intrínsecos
são necessários em arquiteturas de 64 bits em que não há suporte para assembly embutido.
Alguns intrínsecos, como __assume e __ReadWriteBarrier , fornecem informações para o compilador, o que
afeta o comportamento do otimizador.
Alguns intrínsecos estão disponíveis apenas como intrínsecos e outros estão disponíveis nas implementações
de intrínsecos e função. Você pode instruir o compilador para usar a implementação intrínseca em uma das
duas maneiras, dependendo se quer habilitar apenas as funções específicas ou todos os intrínsecos. A primeira
maneira é usar a #pragma intrinsic( lista intrínseca-function-name ) . O pragma pode ser usado para
especificar um único intrínseco ou vários intrínsecos separados por vírgulas. A segunda é usar a opção de
compilador /Oi (gerar funções intrínsecas) , o que torna todos os intrínsecos em uma determinada plataforma
disponíveis. Em /Oi , use #pragma function( intrínseco-function-name-list ) para forçar uma chamada de
função a ser usada em vez de uma intrínseca. Se a documentação de uma determinada nota intrínseca que a
rotina só está disponível como intrínseca, a implementação intrínseca é usada independentemente de /Oi ou
#pragma intrinsic ser especificado. Em todos os casos, /Oi ou #pragma intrinsic permite, mas não força, o
otimizador a usar o intrínseco. O otimizador ainda pode chamar a função.
Algumas funções de biblioteca de C/C++ padrão estão disponíveis em implementações intrínsecas em algumas
arquiteturas. Ao chamar uma função CRT, a implementação intrínseca será usada se /Oi for especificado na
linha de comando.
Um arquivo de cabeçalho, <intrin.h> , está disponível que declara protótipos para as funções intrínsecas
comuns. Os intrínsecos específicos do fabricante estão disponíveis nos <immintrin.h> <ammintrin.h> arquivos
de cabeçalho e. Além disso, determinados cabeçalhos Windows declaram funções que mapeiam para um
compilador intrínseco.
As seções a seguir listam todos os intrínsecos que estão disponíveis em várias arquiteturas. Para obter mais
informações sobre como os intrínsecos funcionam no seu processador de destino específico, consulte a
documentação de referência do fabricante.
Intrínsecos ARM
Intrínsecos do ARM64
Lista de intrínsecos x86
Lista de intrínsecos x64 (amd64)
Intrínsecos disponíveis em todas as arquiteturas
Listagem alfabética de funções intrínsecas
Veja também
Referência do ARM Assembler
Referência do Microsoft Macro Assembler
Palavras-chave
Referência da biblioteca de tempo de execução C
Referência do assembler ARM
13/05/2021 • 2 minutes to read
Os artigos nesta seção da documentação fornecem material de referência para o Microsoft ARM assembler
(armasm) e ferramentas relacionadas.
Artigos relacionados
T ÍT ULO DESC RIÇ Ã O
Diretivas do ARM Assembler Descreve as diretivas ARM que são diferentes no armasm.
Manual de referência da arquitetura ARM no site do Escolha o manual relevante para sua arquitetura ARM. Cada
desenvolvedor ARM. contém seções de referência sobre ARM, Thumb, NEON e
VFP, além de informações adicionais sobre a linguagem de
montagem do ARM.
Guia do usuário do ARM Compiler armasm no site do Escolha uma versão recente para encontrar informações
desenvolvedor ARM. atualizadas sobre a linguagem do assembly ARM.
Obser vação: O assembler "armasm" que é mencionado no
site do desenvolvedor do ARM não é o Microsoft armasm
Assembler que está incluído no Visual Studio e está
documentado nesta seção.
Veja também
Intrínsecos do ARM
Intrínsecos do ARM64
Intrínsecos do compilador
Assembler embutido
13/05/2021 • 2 minutes to read
Específico da Microsoft
A linguagem de assembly serve para muitas finalidades, como melhorar a velocidade do programa, reduzir as
necessidades de memória e controlar o hardware. É possível usar o assembler embutido para inserir instruções
da linguagem de assembly incorporada diretamente em seus programas de código-fonte C e C++, sem etapas
adicionais de assembly e vinculação. O assembler embutido é integrado ao compilador e, portanto, não é
necessário um assembler separado, como o MASM (Microsoft Macro Assembler).
NOTE
Os programas com código assembler embutido não são totalmente portáteis para outras plataformas de hardware. Se
seu projeto visa portabilidade, evite usar o assembler embutido.
Não há suporte para o assembly embutido nos processadores ARM e x64. Os tópicos a seguir explicam como
usar o assembler embutido do Visual C/C++ com processadores x86:
Visão geral do assembler embutido
Vantagens do assembly embutido
__asm
Usando o idioma do assembly em blocos de __asm
Usando C ou C++ em blocos de __asm
Usando e preservando os registros no assembly embutido
Saltando para rótulos no assembly embutido
Chamando funções de C no assembly embutido
Chamando funções C++ em assembly embutido
Definindo blocos de __asm como macros C
Otimizando assembly embutido
FINAL específico da Microsoft
Veja também
Intrínsecos do compilador e linguagem do assembly
Referência da linguagem C++
Referência do Microsoft Macro Assembler
13/05/2021 • 2 minutes to read
O MASM (Microsoft Macro Assembler) oferece várias vantagens sobre o assembly embutido. O MASM contém
uma linguagem macro que tem recursos como loop, aritmética e processamento de cadeias de caracteres de
texto. O MASM também oferece maior controle sobre o hardware, porque ele é compatível com conjuntos de
instrução de processadores 386, 486 e Pentium. Usando o MASM, também é possível reduzir o tempo e a
sobrecarga de memória.
Nesta seção
Opção de linha de comando ML e ML64
Descreve as opções de linha de comando ML.exe e ML64.exe.
Mensagens de erro de ML
Descreve mensagens e avisos de erro fatais e não fatais do ML.exe.
Referência de diretivas
Fornece links para artigos que abordam o uso de diretivas no MASM.
Referência de símbolos
Fornece links para artigos que abordam o uso de símbolos no MASM.
Referência de operadores
Fornece links para artigos que abordam o uso de operadores no MASM.
Manuais de programação do fabricante do processador
Fornece links para sites que podem conter informações de programação sobre processadores que a Microsoft
não fabrica nem vende ou com os quais ela não é compatível.
MASM para x64 (ml64.exe)
Informações sobre como criar arquivos de saída para x64.
MASM BNF Grammar
Descrição formal de BNF de MASM para x64.
Seções relacionadas
C++ no Visual Studio
Fornece links para diferentes áreas da documentação do Visual Studio e do Visual C++.
Veja também
Intrínsecos do compilador
x86Intrinsics
Intrínsecos x64 (amd64)
Extensões de componentes para .NET e UWP
13/05/2021 • 6 minutes to read
O padrão C++ permite que os fornecedores de compiladores forneçam extensões não padrão para a
linguagem. A Microsoft fornece extensões para ajudar você a conectar o código C++ nativo ao código
executado no .NET Framework ou na Plataforma Universal do Windows (UWP). As extensões .NET são chamadas
de C++/CLI e geram um código que é executado no ambiente de execução gerenciado pelo .NET, chamado de
Common Language Runtime (CLR). As extensões da UWP são chamadas de C++ /CX e geram um código de
máquina nativo.
NOTE
Para novos aplicativos, recomendamos o uso de C++/WinRT em vez de C++/CX. C++/WinRT é uma nova projeção de
linguagem padrão C++17 para APIs do Windows Runtime. Continuaremos a dar suporte a C++/CX e WRL, mas
recomendamos que os novos aplicativos usem o C++/WinRT. Para obter mais informações, consulte C++/WinRT.
ref struct
estrutura de valor
PA L AVRA - C H AVE C O N T EXT UA L F IN A L IDA DE REF ERÊN C IA
interface struct
enum struct
Especificadores de Substituição
Você pode usar as seguintes palavras-chave para qualificar o comportamento de substituição para derivação.
Embora a new palavra-chave não seja uma extensão do C++, ela é listada aqui porque pode ser usada em um
contexto adicional. Alguns especificadores também são válidos para programação nativa. Para obter mais
informações, consulte como: declarar especificadores de substituição em compilações nativas (C++/CLI).
new Não Indica que uma função não novo (novo slot em vtable)
é uma substituição de uma
versão de classe base.
Palavras-chave diversas
As seguintes palavras-chave foram adicionadas às extensões C++.
Construções de modelo
As seguintes construções de linguagem são implementadas como modelos, em vez de como palavras-chave. Se
você especificar a opção de compilador /ZW , eles serão definidos no namespace lang . Se você especificar a
opção de compilador /clr , eles serão definidos no namespace cli .
TÓ P IC O DESC RIÇ Ã O
Listas de argumentos variáveis (...) (C++/CLI) (Windows Runtime e CLR) Permite que uma função obtenha
um número variável de argumentos.
.NET Framework equivalentes a tipos nativos C++ (C++/CLI) Lista os tipos de CLR que são usados no lugar dos tipos
integrais de C++.
AppDomain __declspec privacidade __declspec modificador que exige que variáveis estáticas e
globais existam por AppDomain.
Conversões de Estilo C-Style com /clr (C++/CLI) Descreve como as conversões C-Style são interpretadas.
Assemblies Friend (C++) Discute como um assembly de cliente pode acessar todos os
tipos em um componente de assembly.
TÓ P IC O DESC RIÇ Ã O
Suporte do compilador para características de tipo Discute como detectar características de tipos em tempo de
compilação.
pragmas gerenciados e não gerenciados Demonstra como funções gerenciadas e não gerenciadas
podem coexistir no mesmo módulo.
processo __declspec do privacidade __declspec modificador que exige que variáveis estáticas e
globais existam por processo.
Veja também
Programação .NET com C++/CLI (Visual C++)
Interoperabilidade entre nativo e .NET
Atributos C++ para COM e .NET
30/07/2021 • 5 minutes to read
A Microsoft define um conjunto de atributos C++ que simplificam a programação COM e .NET Framework
desenvolvimento de common language runtime. Quando você inclui atributos em seus arquivos de origem, o
compilador trabalha com DLLs do provedor para inserir código ou modificar o código nos arquivos de objeto
gerados. Esses atributos auxiliam na criação de arquivos .idl, interfaces, bibliotecas de tipos e outros elementos
COM. No IDE (ambiente de desenvolvimento integrado), os atributos são suportados pelos assistentes e pelo
janela Propriedades.
Embora os atributos eliminem algumas das codificações detalhadas necessárias para escrever objetos COM,
você precisa de uma experiência em conceitos básicos do COM para melhor usá-los.
NOTE
Se você estiver procurando atributos padrão do C++, consulte Atributos.
Finalidade de atributos
Os atributos estendem o C++ em direções não possíveis no momento sem quebrar a estrutura clássica da
linguagem. Os atributos permitem que provedores (DLLs separadas) estendam a funcionalidade de linguagem
dinamicamente. O objetivo principal dos atributos é simplificar a adoção de componentes COM, além de
aumentar o nível de produtividade do desenvolvedor do componente. Os atributos podem ser aplicados a
praticamente qualquer constructo do C++, como classes, membros de dados ou funções membro. Veja a seguir
um destaque dos benefícios fornecidos por essa nova tecnologia:
Expõe uma convenção de chamada familiar e simples.
Usa o código inserido, que, ao contrário das macros, é reconhecido pelo depurador.
Permite derivação fácil de classes base sem detalhes de implementação onerosos.
Substitui a grande quantidade de código IDL exigida por um componente COM por alguns atributos
concisos.
Por exemplo, para implementar um simples sink de eventos para uma classe ATL genérica, você pode aplicar o
atributo event_receiver a uma classe específica, como CMyReceiver . Em event_receiver seguida, o atributo é
compilado pelo compilador do Microsoft C++, que insere o código adequado no arquivo de objeto.
[event_receiver(com)]
class CMyReceiver
{
void handler1(int i) { ... }
void handler2(int i, float j) { ... }
}
Em seguida, você pode configurar os métodos e manipular eventos (usando a função CMyReceiver handler1
handler2 intrínseca __hook) de uma origem do evento, que você pode criar usando event_source .
NOTE
O uso do atributo não altera o conteúdo do arquivo de origem. A única vez que o código de atributo gerado fica visível é
durante as sessões de depuração. Além disso, para cada arquivo de origem no projeto, você pode gerar um arquivo de
texto que exibe os resultados da substituição de atributo. Para obter mais informações sobre esse procedimento, consulte
/Fx (Mesclar código injetado) e Depurando código injetado.
Como a maioria dos constructos do C++, os atributos têm um conjunto de características que definem seu uso
adequado. Isso é conhecido como o contexto do atributo e é abordado na tabela de contexto de atributo para
cada tópico de referência de atributo. Por exemplo, o atributo coclass só pode ser aplicado a uma classe ou
estrutura existente, em vez do atributo cpp_quote, que pode ser inserido em qualquer lugar dentro de um
arquivo de origem C++.
Nesta seção
Perguntas frequentes sobre programação de atributo
Atributos por grupo
Atributos por uso
Referência alfabética de atributos
Bibliotecas
13/05/2021 • 2 minutes to read
O Visual Studio inclui as bibliotecas a seguir quando você instala uma ou mais cargas de trabalho do C++. Para
obter informações sobre como instalar bibliotecas de terceiros, consulte vcpkg.
Bibliotecas padrão
Biblioteca de runtime C
Biblioteca Padrão do C++
Biblioteca SafeInt
OpenMP
A biblioteca de tempo de execução da Microsoft fornece rotinas para a programação do sistema operacional
Microsoft Windows. Essas rotinas automatizam muitas tarefas comuns de programação que não são fornecidas
pelas linguagens C e C++.
Programas de exemplo estão incluídos nos tópicos de referência individuais para a maioria das rotinas na
biblioteca.
Nesta seção
Rotinas de tempo de execução C universal por categoria
Fornece links para a biblioteca de tempo de execução por categoria.
Variáveis globais e tipos padrão
Fornece links para as variáveis globais e tipos padrão fornecidos pela biblioteca de tempo de execução.
Constantes globais
Fornece links para as constantes globais definidas pela biblioteca de tempo de execução.
Estado global
Descreve o escopo do estado global na biblioteca de tempo de execução C.
Mapeamentos de texto genérico
Fornece links para os mapeamentos de texto genérico definidos em Tchar.h.
Referência de função alfabética
Fornece links para as funções da biblioteca de tempo de execução C, organizadas em ordem alfabética.
Visões gerais da família de funções
Fornece links para as funções da biblioteca de tempo de execução C, organizadas por família de funções.
Cadeias de caracteres de idioma e país/região
Descreve como usar a setlocale função para definir o idioma e cadeias de caracteres de país/região.
Arquivos de biblioteca de tempo de execução C (CRT) e C++ Standard (STL) .lib
Lista de .lib arquivos que compõem as bibliotecas de tempo de execução C e suas opções de compilador e
diretivas de pré-processador associadas.
Seções relacionadas
Rotinas de depuração
Fornece links para as versões de depuração das rotinas da biblioteca de tempo de execução.
Verificação de erros em tempo de execução
Fornece links para funções que dão suporte a verificações de erro em tempo de execução.
Comportamento da biblioteca de tempo de execução de DLLs e Visual C++
Discute o código de inicialização e o ponto de entrada usado para uma DLL.
Pura
Fornece links para usar o depurador do Visual Studio para corrigir erros de lógica em seu aplicativo ou
procedimentos armazenados.
Referência da Biblioteca Padrão C++
13/05/2021 • 2 minutes to read
É possível chamar um programa do C++ em um grande número de funções por meio dessa implementação em
conformidade da Biblioteca Padrão C++. Essas funções executam serviços como entrada e saída e fornecem
implementações eficientes de operações usadas com frequência.
Para obter mais informações sobre como vincular com o arquivo de tempo de execução do Visual C++
apropriado .lib , consulte .lib arquivos de biblioteca de tempo de execução C (CRT) e C++ standard library
(STL).
Nesta seção
Visão geral da biblioteca padrão do C++
Fornece uma visão geral da implementação da Microsoft da Biblioteca Padrão C++.
iostream Çã
Fornece uma visão geral da iostream programação.
Referência de arquivos de cabeçalho
Fornece links para tópicos de referência sobre os arquivos de cabeçalho da biblioteca padrão do C++, com
exemplos de código.
Biblioteca de SafeInt
13/05/2021 • 2 minutes to read
SafeInt é uma biblioteca portátil que pode ser usada com MSVC, GCC ou Clang para ajudar a evitar estouros de
inteiros que podem ocorrer quando o aplicativo realiza operações matemáticas. A versão mais recente desta
biblioteca está localizada em https://github.com/dcleblanc/SafeInt .
Nesta seção
SEÇ Ã O DESC RIÇ Ã O
Funções (SafeInt) Funções que podem ser usadas sem a criação de um objeto
SafeInt .
Seções relacionadas
SEÇ Ã O DESC RIÇ Ã O
Estende as primitivas de inteiro para ajudar a evitar o estouro de inteiro e permite comparar diferentes tipos de
inteiros.
NOTE
A versão mais recente da biblioteca SafeInt está localizada em https://github.com/dcleblanc/SafeInt . Para usar a biblioteca
SafeInt, clone o repositório e #include "SafeInt.hpp"
Sintaxe
template<typename T, typename E = _SAFEINT_DEFAULT_ERROR_POLICY>
class SafeInt;
Parâmetros
T
O tipo de inteiro ou parâmetro booliano que SafeInt substitui.
E
Um tipo de dados enumerados que define a política de tratamento de erro.
U
O tipo de inteiro ou parâmetro booliano para o operando secundário.
RHS
[in] Um parâmetro de entrada que representa o valor no lado direito do operador em várias funções
independentes.
Encontrei
[in] Um parâmetro de entrada que representa o valor no lado direito do operador em várias funções
independentes.
bits
[in] Um parâmetro de entrada que representa o valor no lado direito do operador em várias funções
independentes.
Membros
Construtores públicos
NAME DESC RIÇ Ã O
Operadores de atribuição
NAME SIN TA XE
= template<typename U>
SafeInt<T,E>& operator= (const U& rhs)
= template<typename U>
SafeInt<T,E>& operator= (const SafeInt<U, E>& rhs)
Operadores de conversão
NAME SIN TA XE
Operadores de comparação
NAME SIN TA XE
== template<typename U>
!= template<typename U>
Operadores aritméticos
NAME SIN TA XE
++ SafeInt<T,E>& operator++ ()
-- SafeInt<T,E>& operator-- ()
% template<typename U>
%= template<typename U>
%= template<typename U>
* template<typename U>
*= template<typename U>
*= template<typename U>
/ template<typename U>
/= template<typename U>
SafeInt<T,E>& operator/= (U i)
/= template<typename U>
+ template<typename U>
+= template<typename U>
+= template<typename U>
- template<typename U>
-= template<typename U>
-= template<typename U>
Operadores lógicos
NAME SIN TA XE
^ template<typename U>
^= template<typename U>
^= template<typename U>
| template<typename U>
|= template<typename U>
|= template<typename U>
Comentários
A classe SafeInt protege contra o estouro de inteiros em operações matemáticas. Por exemplo, considere
adicionar dois inteiros de 8 bits: um tem o valor 200, o outro, 100. A operação matemática correta seria 200 +
100 = 300. No entanto, devido ao limite de inteiros de 8 bits, o bit superior será perdido, e o compilador
retornará como resultado 44 (300 - 28). Qualquer operação que depender dessa equação matemática gerará um
comportamento inesperado.
A classe SafeInt verifica se um estouro aritmético ocorreu ou se o código tenta dividir por zero. Em ambos os
casos, a classe chama o manipulador de erro para avisar o programa sobre o possível problema.
Essa classe também permite comparar dois tipos diferentes de inteiros, desde que sejam objetos SafeInt .
Normalmente, quando você faz uma comparação, primeiro você deve converter os números para serem do
mesmo tipo. Converter um número em outro tipo geralmente requer verificações para garantir que não haja
perda de dados.
A tabela Operadores neste tópico mostra os operadores matemáticos e de comparação compatíveis com a
classe SafeInt . A maioria dos operadores matemáticos retorna um objeto SafeInt do tipo T .
Operações de comparação entre um SafeInt e um tipo integral podem ser executadas em qualquer direção.
Por exemplo, SafeInt<int>(x) < y e y> SafeInt<int>(x) são válidos e retornarão o mesmo resultado.
Muitos operadores binários não oferecem suporte ao uso de dois SafeInt tipos diferentes. Um exemplo disso é
o operador & . SafeInt<T, E> & int tem suporte, mas SafeInt<T, E> & SafeInt<U, E> não é. No último
exemplo, o compilador não sabe o tipo de parâmetro a ser retornado. Uma solução para esse problema é
converter o segundo parâmetro de volta no tipo base. Usando os mesmos parâmetros, isso pode ser feito com
SafeInt<T, E> & (U)SafeInt<U, E> .
NOTE
Para qualquer operação bit a bit, os dois parâmetros diferentes devem ter o mesmo tamanho. Se os tamanhos forem
diferentes, o compilador lançará uma exceção ASSERT. Não é garantido que os resultados dessa operação sejam precisos.
Para resolver esse problema, converta o parâmetro menor até que ele tenha o mesmo tamanho que o parâmetro maior.
Para operadores de deslocamento, a mudança para mais bits do que existe para o tipo de modelo lançará uma
exceção ASSERT. Isso não terá efeito no modo de liberação. A combinação de dois tipos de parâmetros SafeInt é
possível para os operadores shift porque o tipo de retorno é o mesmo do tipo original. O número no lado
direito do operador indica apenas o número de bits a serem alterados.
Quando você faz uma comparação lógica com um objeto SafeInt, a comparação é estritamente aritmética. Por
exemplo, considere estas expressões:
SafeInt<uint>((uint)~0) > -1
((uint)~0) > -1
A primeira instrução é resolvida como true , mas a segunda instrução é resolvida para false . A negação bit a
bit de 0 é 0xFFFFFFFF. Na segunda instrução, o operador de comparação padrão compara 0xFFFFFFFF a
0xFFFFFFFF e os considera iguais. O operador de comparação da classe SafeInt percebe que o segundo
parâmetro é negativo, enquanto o primeiro não tem sinal. Portanto, apesar de a representação de bits ser
idêntica, o operador lógico SafeInt percebe que o inteiro sem sinal é maior que -1.
Tenha cuidado ao usar a classe SafeInt junto com o operador ternário ?: . Considere a seguinte linha de
código.
Se flag for false , o compilador lançará uma exceção em vez de atribuir o valor de-1 a x . Portanto, para
evitar esse comportamento, o código correto a ser usado é a seguinte linha.
T e U podem receber um tipo booliano, um tipo caractere ou um tipo inteiro. Os tipos inteiros podem ser
assinados ou não assinados e ter qualquer tamanho de 8 a 64 bits.
NOTE
Embora a classe SafeInt aceite qualquer tipo inteiro, seu desempenho de execução é melhor com tipos sem sinal.
E é o mecanismo de tratamento de erro usado por SafeInt . Dois mecanismos de tratamento de erro são
fornecidos com a biblioteca SafeInt. A política padrão é SafeIntErrorPolicy_SafeIntException , que gera uma
exceção SafeIntException Class quando ocorre um erro. A outra política é SafeIntErrorPolicy_InvalidParameter ,
que interromperá o programa se ocorrer um erro.
Existem duas opções para personalizar a política de erro. A primeira opção é definir o parâmetro E quando
você cria um SafeInt . Use essa opção quando quiser alterar a política de tratamento de erro para apenas um
SafeInt . A outra opção é definir _SAFEINT_DEFAULT_ERROR_POLICY como sua classe personalizada de
tratamento de erro antes de incluir a biblioteca SafeInt . Use essa opção quando quiser mudar a política de
tratamento de erros padrão para todas as instâncias da classe SafeInt no seu código.
NOTE
Uma classe personalizada que manipula erros da biblioteca SafeInt não deve retornar o controle para o código que
chamou o manipulador de erros. Depois que o manipulador de erro é chamado, o resultado da SafeInt operação não
pode ser confiável.
Hierarquia de herança
SafeInt
Requisitos
Cabeçalho: SafeInt. HPP
NOTE
A versão mais recente desta biblioteca está localizada em https://github.com/dcleblanc/SafeInt . Clone a biblioteca e inclua
SafeInt. HPP para usar a biblioteca SafeInt. Prefira que este repositório GitHub SafeInt. h. é uma versão moderna do
<SafeInt. h> que inclui um pequeno número de correções de bugs, usa recursos modernos do C++ resultando em um
código mais eficiente e é portátil para qualquer plataforma que use compiladores gcc, Clang ou Intel.
Exemplo
#include "SafeInt.hpp" // set path to your clone of the SafeInt GitHub repo
(https://github.com/dcleblanc/SafeInt)
int main()
{
int divisor = 3;
int dividend = 6;
int result;
Namespace: nenhum
SafeInt:: SafeInt
Constrói um objeto SafeInt .
SafeInt() throw
Parâmetros
i
[in] O valor do novo objeto SafeInt . Este deve ser um parâmetro do tipo T ou U, dependendo do construtor.
b
[in] O valor booliano do novo objeto SafeInt .
u
[in] Um SafeInt do tipo U. O novo objeto SafeInt terá o mesmo valor que u, mas será do tipo T.
U O tipo de dados armazenados no SafeInt . Isso pode ser um tipo booliano, caractere ou inteiro. Se for um
tipo inteiro, ele poderá ser assinado ou não assinado e ficar entre 8 e 64 bits.
Comentários
O parâmetro de entrada para o construtor, i ou u, deve ser um tipo booliano, caractere ou inteiro. Se for outro
tipo de parâmetro, a SafeInt classe chamará static_assert para indicar um parâmetro de entrada inválido.
Os construtores que usam o tipo modelo U convertem automaticamente o parâmetro de entrada no tipo
especificado por T . A classe SafeInt converte os dados sem perda de dados. Ele informa ao manipulador de
erros E se ele não pode converter os dados para tipo T sem perda de dados.
Se você criar um SafeInt de um parâmetro booliano, precisará inicializar o valor imediatamente. Você não
pode construir um SafeInt usando o código SafeInt<bool> sb; . Isso gerará um erro de compilação.
Funções (SafeInt)
13/05/2021 • 5 minutes to read
A biblioteca SafeInt fornece várias funções que você pode usar sem criar uma instância da classe SafeInt. Se
quiser proteger uma única operação matemática contra estouros de inteiro, você pode usar essas funções. Se
quiser proteger várias operações matemáticas, você deve criar objetos SafeInt . É mais eficiente criar SafeInt
objetos do que usar essas funções várias vezes.
Essas funções permitem comparar ou realizar operações matemáticas em dois tipos diferentes de parâmetros
sem antes precisar convertê-los no mesmo tipo.
Cada uma dessas funções tem dois tipos de modelo: T e U . Cada um desses tipos pode ser um tipo booliano,
caractere ou integral. Tipos integrais podem ser assinados ou não assinados e ter qualquer tamanho de 8 a 64
bits.
NOTE
A versão mais recente desta biblioteca está localizada em https://github.com/dcleblanc/SafeInt .
Nesta seção
F UN Ç Ã O DESC RIÇ Ã O
SafeEquals, SafeGreaterThan, SafeGreaterThanEquals, Compara dois números. Essas funções permitem comparar
SafeLessThan, SafeLessThanEquals, SafeNotEquals dois tipos diferentes de números sem alterar seus tipos.
Seções relacionadas
SEÇ Ã O DESC RIÇ Ã O
SafeAdd
Adiciona dois números de uma maneira que protege contra estouros.
Parâmetros
t
[in] O primeiro número a adicionar. Deve ser do tipo T.
u
[in] O segundo número a adicionar. Deve ser do tipo U.
result
[out] O parâmetro em que SafeAdd armazena o resultado.
Valor Retornado
true Se nenhum erro ocorrer; false se ocorrer um erro.
SafeCast
Converte um tipo de número em outro tipo.
Parâmetros
De
[in] O número de origem para converter. Deve ser do tipo T .
Para
[out] Uma referência ao novo tipo de número. Deve ser do tipo U .
Valor Retornado
true Se nenhum erro ocorrer; false se ocorrer um erro.
SafeDivide
Divide dois números de uma maneira que protege contra a divisão por zero.
Parâmetros
t
[in] O dividendo. Deve ser do tipo T.
u
[in] O divisor. Deve ser do tipo U.
result
[out] O parâmetro em que SafeDivide armazena o resultado.
Valor Retornado
true Se nenhum erro ocorrer; false se ocorrer um erro.
SafeEquals
Compara dois números para determinar se eles são iguais.
Parâmetros
t
[in] O primeiro número para comparar. Deve ser do tipo T.
u
[in] O segundo número para comparar. Deve ser do tipo U.
Valor Retornado
true Se t e u forem iguais; caso contrário false .
Comentários
O método aprimora == porque SafeEquals permite comparar dois tipos diferentes de números.
SafeGreaterThan
Compara dois números.
Parâmetros
t
[in] O primeiro número para comparar. Deve ser do tipo T .
u
[in] O segundo número para comparar. Deve ser do tipo U .
Valor Retornado
true Se t for maior que u; caso contrário false .
Comentários
SafeGreaterThan estende o operador de comparação regular, permitindo que você compare dois tipos
diferentes de números.
SafeGreaterThanEquals
Compara dois números.
Parâmetros
t
[in] O primeiro número para comparar. Deve ser do tipo T .
u
[in] O segundo número para comparar. Deve ser do tipo U .
Valor Retornado
true Se t for maior ou igual a u; caso contrário false .
Comentários
SafeGreaterThanEquals aprimora o operador de comparação padrão porque permite comparar dois tipos
diferentes de números.
SafeLessThan
Determina se um número é menor que outro.
Parâmetros
t
[in] O primeiro número. Deve ser do tipo T .
u
no O segundo número. Deve ser do tipo U .
Valor Retornado
true Se t for menor que u; caso contrário false .
Comentários
Esse método aprimora o operador de comparação padrão porque SafeLessThan permite comparar dois tipos
diferentes de números.
SafeLessThanEquals
Compara dois números.
template <typename T, typename U>
inline bool SafeLessThanEquals (
const T t,
const U u
) throw ();
Parâmetros
t
[in] O primeiro número para comparar. Deve ser do tipo T .
u
[in] O segundo número para comparar. Deve ser do tipo U .
Valor Retornado
true Se t for menor ou igual a u; caso contrário false .
Comentários
SafeLessThanEquals estende o operador de comparação regular, permitindo que você compare dois tipos
diferentes de números.
SafeModulus
Realiza a operação de módulo em dois números.
Parâmetros
t
[in] O divisor. Deve ser do tipo T .
u
[in] O dividendo. Deve ser do tipo U .
result
[out] O parâmetro em que SafeModulus armazena o resultado.
Valor Retornado
true Se nenhum erro ocorrer; false se ocorrer um erro.
SafeMultiply
Multiplica dois números juntos de uma forma que protege contra estouros.
SafeNotEquals
Determina se dois números não são iguais.
Parâmetros
t
[in] O primeiro número para comparar. Deve ser do tipo T .
u
[in] O segundo número para comparar. Deve ser do tipo U .
Valor Retornado
true Se t e u não forem iguais; caso contrário false .
Comentários
O método aprimora != porque SafeNotEquals permite comparar dois tipos diferentes de números.
SafeSubtract
Subtrai dois números de uma maneira que protege contra estouros.
Parâmetros
t
[in] O primeiro número na subtração. Deve ser do tipo T .
u
[in] O número para subtrair de t. Deve ser do tipo U .
result
[out] O parâmetro em que SafeSubtract armazena o resultado.
Valor Retornado
true Se nenhum erro ocorrer; false se ocorrer um erro.
Classe SafeIntException
13/05/2021 • 2 minutes to read
A classe SafeInt usa SafeIntException para identificar por que uma operação matemática não pode ser
concluída.
NOTE
A versão mais recente desta biblioteca está localizada em https://github.com/dcleblanc/SafeInt .
Sintaxe
class SafeIntException;
Membros
Construtores públicos
NAME DESC RIÇ Ã O
Comentários
A classe SafeInt é a única que usa a classe SafeIntException .
Hierarquia de herança
SafeIntException
Requisitos
Cabeçalho: safeint.h
Namespace: msl::utilities
SafeIntException:: SafeIntException
Cria um objeto SafeIntException .
SafeIntException();
SafeIntException(
SafeIntError code
);
Parâmetros
code
[in] Um valor de dados enumerados que descreve o erro ocorrido.
Comentários
Os valores possíveis para code estão definidos no arquivo Safeint.h. Para praticidade, os valores possíveis
também aparecem nesta lista.
SafeIntNoError
SafeIntArithmeticOverflow
SafeIntDivideByZero
MFC e ATL
13/05/2021 • 2 minutes to read
O MFC (MFC) fornece um wrapper C++ orientado a objeto no Win32 para o desenvolvimento rápido de
aplicativos de desktop nativos. A Active Template Library (ATL) é uma biblioteca de wrapper que simplifica o
desenvolvimento COM e é usada extensivamente para a criação de controles ActiveX.
Você pode criar programas MFC ou ATL com o Visual Studio Community Edition ou superior. As Express Editions
não dão suporte a MFC ou ATL.
No Visual Studio 2015, Visual C++ é um componente opcional, e os componentes MFC e ATL são
subcomponentes opcionais em Visual C++. Se você não selecionar esses componentes ao instalar o Visual
Studio pela primeira vez, será solicitado a instalá-los na primeira tentativa de criar ou abrir um projeto MFC ou
ATL.
No Visual Studio 2017 e posterior, o MFC e o ATL são subcomponentes opcionais no desenvolvimento de
desktop com carga de trabalho do C++ no programa de instalador do Visual Studio. Você pode instalar o
suporte ATL sem MFC ou MFC combinado e suporte ATL (o MFC depende da ATL). Para obter mais informações
sobre cargas de trabalho e componentes, consulte instalar o Visual Studio.
Artigos relacionados
T ÍT ULO DESC RIÇ Ã O
Aplicativos de área de trabalho do MFC MFC fornecer um wrapper fino orientado a objeto sobre o
Win32 para permitir o rápido desenvolvimento de aplicativos
de GUI em C++.
Componentes de área de trabalho COM da ATL A ATL fornece modelos de classe e outras construções de
uso para simplificar a criação de objetos COM em C++.
Classes compartilhadas ATL/MFC Referências para classe CStringT e outras classes que são
compartilhadas por MFC e ATL.
Trabalhando com arquivos de recurso O editor de recursos permite que você edite recursos de
interface do usuário, como cadeias de caracteres, imagens e
caixas de diálogo.
O Visual C++ fornece as seguintes tecnologias para ajudá-lo a criar programas multithread e paralelos que
aproveitam vários núcleos e usam a GPU para programação de uso geral.
Artigos relacionados
T ÍT ULO DESC RIÇ Ã O
C++ AMP (C++ Accelerated Massive Parallelism) Classes que permitem o uso de processadores gráficos
modernos para programação de uso geral.
Suporte multithread para código anterior (Visual C++) Tecnologias mais antigas que podem ser úteis em aplicativos
mais antigos. Para novos aplicativos, use o Tempo de
Execução de Simultaneidade ou o C++ AMP.
Praticamente todos os produtos de banco de dados, SQL e NoSQL, fornecem uma interface para aplicativos
nativos do C++. A interface padrão do setor é ODBC, que dá suporte para todos os principais produtos de
Banco de Dados SQL e para muitos produtos NoSQL. Para produtos que não são da Microsoft, consulte o
fornecedor para obter mais informações. Bibliotecas de terceiros com vários termos de licença também estão
disponíveis.
Desde 2011, a Microsoft tem se alinhado com o ODBC como o padrão para aplicativos nativos para se conectar
a bancos de dados do Microsoft SQL Server, tanto localmente quanto na nuvem. Para obter mais informações,
consulte Programação de acesso a dados (MFC/ATL). As bibliotecas C++/CLI podem usar os drivers ODBC
nativos ou ADO.NET. Para obter mais informações, consulte acesso a dados usando ADO.net (C++/CLI) e
acessando dados no Visual Studio.
Nesta seção
Programação de acesso a dados (MFC/ATL)
Descreve programação de acesso a dados herdados com Visual C++, em que a melhor maneira é usar uma das
bibliotecas de classe, como a classe biblioteca ATL (Active Template Library) ou a biblioteca MFC (Microsoft
Foundation Class), que simplificam o trabalho com as APIs do banco de dados.
Conectividade aberta de banco de dados (ODBC)
A biblioteca MFC (Microsoft Foundation Classes) fornece classes para programar com ODBC (Conectividade
Aberta de Banco de Dados).
Programação de OLE DB
Uma interface principalmente herdada que ainda é necessária em alguns cenários, especialmente quando você
está programando com relação a servidores vinculados.
Tópicos Relacionados
Conectar-se ao Banco de Dados SQL usando C e C++
Conecte-se ao Banco de Dados SQL do Azure de aplicativos C ou C++.
Biblioteca de Clientes do Armazenamento do Microsoft Azure para C++
O Armazenamento do Azure é uma solução de armazenamento em nuvem para aplicativos modernos que
dependem de durabilidade, disponibilidade e escalabilidade para atender às necessidades dos clientes. Conecte-
se ao Armazenamento do Azure pelo C++ usando a Biblioteca de Cliente do Armazenamento do Azure para
C++.
ODBC Driver for SQL Server
O driver ODBC mais recente fornece um eficiente acesso a dados para o Microsoft SQL Server e para o Banco
de Dados SQL do Microsoft Azure para aplicativos baseados em C/C++. Ele dá suporte para recursos, incluindo
o Always Encrypted, o Azure Active Directory e os Grupos de Disponibilidade AlwaysOn. Também está
disponível para MacOS e Linux.
Driver do OLE DB para SQL Server
O driver OLE DB mais recente é uma API (interface de programação de aplicativo) de acesso a dados autônoma
que é compatível com Microsoft SQL Server e ao Banco de Dados SQL do Microsoft Azure.
Central de Desenvolvedores do Microsoft Azure C e C++
O Azure facilita o build de aplicativos do C++, com maior flexibilidade, escalabilidade e confiabilidade usando
ferramentas que você adora.
Como usar o armazenamento de BLOBs do C++
O Armazenamento de Blobs do Azure é um serviço que armazena dados não estruturados na nuvem como
objetos/blobs. O Armazenamento de Blobs pode conter qualquer tipo de texto ou de dados binários, como um
documento, um arquivo de mídia ou um instalador de aplicativo. O Armazenamento de Blobs também é
chamado de armazenamento de objeto.
Referência do programador ODBC
A interface ODBC é projetada para uso com a linguagem de programação C. O uso da interface ODBC abrange
três áreas: instruções SQL, chamadas da função ODBC e programação em C.
Veja também
C++ no Visual Studio