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:
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
,set
emap
.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.
A entrada/saída inclui componentes para declarações de encaminhamento de
iostreams
(iosfwd
), objetos predefinidosiostreams
(iostream
), classes baseiostreams
(ios
), buffer de fluxo (streambuf
), formatação de fluxo e manipuladores (iosmanip
, ,istream
),ostream
fluxos de cadeia de caracteres (sstream
) e fluxos de arquivos (fstream
).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
, ),climits
funçõ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
,csetlmp
csignal
).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
, ,cwctype
cwchar
).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.