Editar

Perguntas frequentes sobre a biblioteca Standard C++

Este artigo fornece uma lista de perguntas frequentes (perguntas frequentes) sobre as bibliotecas Standard C++ e as respostas a essas perguntas.

Versão original do produto: Visual C++
Número de KB original: 154419

O que a biblioteca Standard C++ contém

A biblioteca Standard C++ fornece uma estrutura extensível e contém componentes para suporte de linguagem, diagnóstico, utilitários gerais, cadeias de caracteres, localidades, biblioteca de modelo padrão (contêineres, iteradores, algoritmos e numéricos) e entrada/saída.

A biblioteca Standard C++ pode ser dividida nas seguintes categorias:

  1. Os componentes STL (Standard Template Library) fornecem um programa C++ com acesso a um subconjunto dos algoritmos e estruturas de dados mais usados. Os cabeçalhos STL podem ser agrupados em três principais conceitos de organização:

    • Contêineres: classes de modelo que dão suporte a maneiras comuns de organizar dados, como vector, list, deque, stack, queue, sete map.

    • Algoritmos: funções de modelo para executar operações comuns em sequências de objetos, como funcional, algoritmo e numérico.

    • Iteradores: a cola que cola algoritmos e contêineres juntos, como utilitário, iterador e memória.

  2. A entrada/saída inclui componentes para declarações de encaminhamento de iostreams (iosfwd), objetos predefinidos iostreams (iostream), classes base iostreams (ios), buffer de fluxo (streambuf), formatação de fluxo e manipuladores (iosmanip, , istream), ostreamfluxos de cadeia de caracteres (sstream) e fluxos de arquivos (fstream).

  3. Outros cabeçalhos C++ padrão incluem:

    • Suporte ao idioma: componentes para definições de tipo comuns usadas em toda a biblioteca (cstddef), características dos tipos predefinidos (limits, cfloat, ), climitsfunções que dão suporte ao início e término de um programa C++ (cstdlib), suporte para gerenciamento dinâmico de memória (new), suporte para identificação de tipo dinâmico (typeinfo), suporte para processamento de exceção (exception) e outro suporte de runtime (cstdarg, , ctime, csetlmpcsignal).

    • Diagnóstico: componentes para relatar vários tipos de condições excepcionais (stdexcept), documentando declarações de programa (cassert) e uma variável global para códigos de número de erro (cerrno).

    • Cadeias de caracteres: componentes para classes de cadeia de caracteres (string) e utilitários de sequência encerrados em nulo (cctype, , cwctypecwchar).

    • Localização: componentes que os programas C++ podem usar para encapsular diferenças culturais. A instalação de localidade inclui suporte de internacionalização para classificação de caracteres e ordenação de cadeia de caracteres, numérico, monetário e formatação de data/hora e análise e recuperação de mensagem (locale, clocale).

Qual é a diferença entre o CRT e a biblioteca C++ Padrão? Quais bibliotecas incluirão as opções do compilador de bibliotecas do Runtime

O Visual C++ inclui as seguintes bibliotecas além das bibliotecas do Microsoft Foundation Classes (MFC):

  • Biblioteca básica do C-Runtime
  • Biblioteca C++ padrão
Tipos de biblioteca e comutadores relacionados Biblioteca básica do C Runtime / Biblioteca C++ Padrão
Thread único (/ML) LIBC. LIB/LIBCP. LIB
Depurar thread único (/MLd) LIBCD. LIB/LIBCPD. LIB
Multithreaded (/MT) LIBCMT. LIB/LIBCPMT. LIB
Depurar multithreaded (/MTd) LIBCMTD. LIB/ LIBCPMTD. LIB
DLL multithreaded (/MD) MSVCRT. LIB/ MSVCPRT. LIB
Depurar Multithreaded /DLL (MDd) MSVCRTD. LIB/ MSVCPRTD. LIB

Observação

  • As opções do compilador de biblioteca /ML e /MLd para bibliotecas com thread único estaticamente foram removidas no Visual C++.
  • MSVCPRT.lib e MSVCPRTD.lib são bibliotecas estáticas e não têm DLLs (bibliotecas de link dinâmico) diretamente relacionadas a elas. Essas bibliotecas também dependem de MSVCRT.lib e MSVCRTD.lib, respectivamente. Se você tiver aplicativos que usam MSVCPRT.lib ou MSVCPRTD.lib e usar a opção Ignorar Biblioteca Padrão (/NOD ou NODEFAULTLIB), vincule MSVCPRT.lib (ou MSVCPRTD.lib) e MSVCRT.lib (ou MSVCRTD.lib) com seu aplicativo. Caso contrário, você receberá erros do vinculador (LNK2001: externos não resolvidos em MSVCPRT.lib ou MSVCPRTD.lib) ao vincular seu aplicativo. Dependendo dos cabeçalhos usados em seu código, uma biblioteca da biblioteca Standard C++ também pode estar vinculada.

O arquivo de cabeçalho use_ansi.h contém #pragma instruções que forçam a biblioteca Standard C++ a ser vinculada. Todos os cabeçalhos C++ Padrão incluem use_ansi.h: se você incluir qualquer cabeçalho C++ Standard em seu aplicativo, a biblioteca Standard C++ será vinculada por padrão.

Cabeçalhos C++ padrão

Coluna 1 Coluna 2 Coluna 3 Coluna 4
ALGORITMO BITSET COMPLEXO DEQUE
EXCEÇÃO FSTREAM FUNCIONAL IOMANIP
IOS IOSFWD IOSTREAM ISTREAM
ITERADOR LIMITES LISTA LOCALIDADE
MAPA MEMÓRIA NUMÉRICO OSTREAM
QUEUE DEFINIR SSTREAM PILHA
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO UTILITÁRIO VALARRAY VETOR

Como manter a funcionalidade 'iostream' antiga do Visual C++ .NET 2003 ou versões anteriores se eu portar meu projeto de uma versão anterior

Se você quiser manter a biblioteca antiga iostream (iostream.h), inclua um ou mais dos arquivos de cabeçalho antigos iostream em seu código. Não use os novos cabeçalhos C++ Padrão. Você não pode misturar chamadas à biblioteca antiga iostream e à nova biblioteca C++ Padrão.

Como fazer das Bibliotecas C++ Padrão as bibliotecas padrão do meu aplicativo

Se você quiser tornar as Bibliotecas C++ Padrão o padrão, inclua um ou mais dos novos cabeçalhos C++ Padrão. Você não pode misturar chamadas com a antiga iostream e a nova biblioteca Standard C++. Bibliotecas existentes (link estático ou dinâmico) que usam funções antigas iostream terão que ser modificadas para usar funções de biblioteca iostream C++ padrão.

Se eu usar bibliotecas C++ padrão em aplicativos MFC, isso causará conflitos com bibliotecas C-Runtime

Não. O MFC (Microsoft Foundation Classes) não usa nenhuma função C-Runtime que entre em conflito com as Bibliotecas C++ Padrão.

Por que eu recebo erro (erro C2065: ''cout'' : identificador não declarado) mesmo que eu tenha incluído 'iostream'

A biblioteca C++ padrão é implementada em seu próprio namespace std. Adicione a seguinte instrução no início do programa:

using namespace std;

Ou qualifique cada identificador de biblioteca Standard C++ com namespace std, por exemplo, std::cout.

Por que recebo erro (erro do compilador C2371: redefinição de 'identificador'; tipos básicos diferentes)

Em versões do Visual C++ que são anteriores ao Visual C++ 2005, a mistura de cabeçalhos C++ padrão e cabeçalhos antigos iostream causa esse erro, mesmo que sejam incluídos em arquivos de origem diferentes. A seguir estão os cabeçalhos diferentes:

  • Cabeçalhos iostream antigos:

    Coluna 1 Coluna 2
    FSTREAM. H IOMANIP. H
    IOS. H IOSTREAM. H
    ISTREAM. H OSTREAM. H
    STDIOSTR. H STREAMB. H
    STRSTREA. H
  • Cabeçalhos C++ padrão:

    Coluna 1 Coluna 2 Coluna 3 Coluna 4
    ALGORITMO BITSET COMPLEXO DEQUE
    EXCEÇÃO FSTREAM FUNCIONAL IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    ITERADOR LIMITES LISTA LOCALIDADE
    MAPA MEMÓRIA NUMÉRICO OSTREAM
    QUEUE DEFINIR SSTREAM PILHA
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO UTILITÁRIO VALARRAY VETOR

Por que recebo mensagem (LNK2001: símbolo externo não resolvido 'símbolo';) em chamadas de função 'iostream' quando o projeto é criado com Ignore Default Libraryes

As iostream funções foram removidas da biblioteca C-Runtime.

Se você estiver usando as funções antigas iostream , deverá adicionar outra biblioteca LIBCI.lib ( ML de thread único), LIBCIMT.lib ( MT multithreaded) ou MSVCIRT.lib ( MD dll multithreaded). Essas bibliotecas foram removidas do Visual C++.

Se você estiver usando as novas iostream funções incluídas na biblioteca Standard C++, deverá adicionar outra biblioteca LIBCP.lib ( ML de thread único), LIBCPMT.lib ( MT multithreaded) ou MSVCPRT.lib ( MD dll multithreaded).

Não misture versões diferentes das bibliotecas. Por exemplo, se você estiver usando a versão de thread único da biblioteca C-Runtime, também deverá usar a versão com thread único da biblioteca antiga iostream ou da biblioteca Standard C++.

Não é possível misturar chamadas às funções antigas iostream da biblioteca e às novas funções de biblioteca iostream C++ Padrão.

Por que recebo avisos de compilador C4786 ou C4788? Nenhum dos símbolos no meu programa está perto de 255 caracteres de comprimento

C4786 ou C4788 é emitido quando o nome de um símbolo excede 255 caracteres de comprimento. Esse problema geralmente acontece com a classe de modelo e STL usa a classe de modelo extensivamente.

Ignorar este aviso é seguro. Use um #pragma aviso (desabilitar: 4786.4788) para suprimir as mensagens.

Por que recebo mensagem (C4530: manipulador de exceção C++ usado, mas semântica de desenrolar não está habilitada. Especificar -GX)

Os programas que usam a biblioteca Standard C++ devem ser compilados com o tratamento de exceção C++ habilitado. O tratamento de exceção do C++ pode ser habilitado por um dos seguintes métodos:

  • Selecionando a opção Habilitar tratamento de exceção na categoria de idioma C++ da guia C/C++ na caixa de diálogo Configurações do Projeto .
  • Usando a opção do compilador /GX .

Por que eu recebo o erro do compilador C2146, seguido por C2065 e, finalmente, C2143, todos apontando para a mesma linha na minha origem

Essa sequência de erros pode ser causada pelo seguinte tipo de build:

vector<int, allocator<int>>iV;

O problema é causado pelo consecutivo >> no final da declaração. A solução é colocar um espaço entre dois caracteres para que o constructo se torne:

vector<int, allocator<int> > iV;

É consistente com a especificação ANSII proposta.