Partilhar via


Alterações de biblioteca C++ padrão: Problemas de atualização

O tópico a seguir discutem as dificuldades que podem ser encontrados com um aplicativo anterior e o novo em time de execução bibliotecas.

  • Diferenças na implementação iostream

  • Projetos anteriores criados com nenhuma bibliotecas padrão

  • Manipulação de exceção de C++ deve ser ativada para a biblioteca C++ padrão

Diferenças na implementação iostream

A Biblioteca iostream antiga foi removida a partir do Visual C++ .NET 2003.

A principal diferença entre a biblioteca C++ padrão e bibliotecas de time de execução anteriores é na Biblioteca iostream.Detalhes da implementação iostream tenham alterado e pode ser necessário reescrever partes do código que use iostream que vincule com a biblioteca C++ padrão.

Você precisará remover quaisquer cabeçalhos iostream antigo (fstream.h, iomanip.h, ios.h, iostream.h, istream.h, ostream.h, streamb.h e strstrea.h) você incluiu no seu código e adicionar um ou mais dos cabeçalhos de novos Standard C++ iostream (<fstream>, <iomanip>, <ios>, <iosfwd><iostream>, < iostream > <istream>, <ostream>, <sstream>, <streambuf>e <strstream>, tudo sem a extensão. h).

A lista a seguir descreve o comportamento na nova biblioteca iostream Standard C++ que difere do comportamento da Biblioteca iostream antigo.

Na Biblioteca iostream Standard C++ nova:

  • em em aberto funções não terão um terceiro parâmetro (o parâmetro de proteção).

  • Não é possível criar fluxos de identificadores de arquivo.

  • Com algumas exceções, todos os nomes na nova biblioteca C++ padrão são no STD namespace.See Usando a biblioteca C++ cabeçalhos para obter mais informações.

  • Não é possível em em aberto ofstream objetos com o IOS::out sinalizar sozinho.The IOS::out sinalizar deve ser combinada com outra ios enumerador de uma lógica OR; Por exemplo, com IOS::in or IOS::App.

  • IOS::mercadoria não retorna um valor diferente de zero depois de atingir o participante de arquivo porque o eofbit estado é conjunto.

  • IOS::conjuntof(_IFlags) não deve ser usado com um valor de sinalizar de IOS::DEC, IOS::Oct, or IOS::hex, a menos que você saiba que nenhum dos sinalizares de base é atualmente conjunto.As funções de entrada/saída formatadas e operadores pressupõem que apenas uma base é conjunto.Em vez disso, use ios_base. For example, setf( ios_base::oct, ios_base::basefield ) clears all base information and sets the base to octal.

  • IOS::unsetf returns void em vez do valor anterior.

  • IStream::Get( char & _Rch ) não atribui a Rch se houver um erro.

  • istream::get( char* _Pch, int _Ncount, char_Delim ) is different in three ways:

    • Quando nada é lido, failbit is conjunto.

    • An EOS é sempre armazenada após a extração de caracteres (isso acontece independentemente do resultado).

    • Um valor -1 para _ Ncount é um erro.

  • IStream::seekg com um parâmetro inválido não define failbit.

  • O tipo de retorno streampos é uma classe com operadores sobrecarregados. Em funções que retornam um streampos valor (sistema autônomo IStream::tellg, ostream::tellp, strstreambuf::seekoff, e strstreambuf::seekpos), você deve converter o valor retornado para o tipo necessário: streamoff, fpos_t, ou mbstate_t.

  • O primeiro parâmetro de função (_Falloc) na strstreambuf::strstreambuf( _Falloc**,** _Ffree ) leva um size_t argumento, não um longo.

Além das alterações acima, as seguintes funções, constantes e enumeradores são elementos da Biblioteca iostream antigo não são elementos da nova biblioteca iostream:

  • attach member function of filebuf, fstream ifstream, and ofstream

  • fd member function of filebuf, fstream ifstream, and ofstream

  • filebuf::openprot

  • filebuf::setmode

  • IOS::bitalloc

  • IOS::NOCREATE

  • IOS::noreplace

  • IOS::sync_with_stdio

  • streambuf::out_waiting

  • streambuf::setbuf (use rdbuf-> pubsetbuf para o mesmo comportamento)

Projetos anteriores criados com nenhuma bibliotecas padrão

Você pode criar um projeto sem bibliotecas padrão selecionando / NODEFAULTLIB.Se seu projeto anterior foi criado com nenhuma biblioteca de padrão e você desejar fazer chamadas iostream, você deve nomear um novo C++ Standard em time de execução bibliotecas (Libcp.lib, Libcpmt.lib, Msvcprt.lib e assim por diante) ou um dos iostream antigo em time de execução bibliotecas (Libci.lib, Libcimt.lib, Msvcirt.lib e assim por diante) para vincular com a biblioteca adequada.

Nas versões de Visual C++ anteriores (4.1 e anteriores), o em time de execução nomes da biblioteca foram Libc.lib Libcmt.lib e Msvcrt.lib.Essas bibliotecas incluíam a Biblioteca iostream antigo.Agora foi removida da Biblioteca iostream antigo dessas bibliotecas.Se você não escolher ignorar bibliotecas padrão e incluir arquivos de cabeçalho iostream antigos em seu código, o antigo iostream em time de execução bibliotecas (Libci.lib, Libcimt.lib, Msvcirt.lib e assim por diante) são vinculadas por padrão.No entanto, se você optou por ignorar bibliotecas padrão e ter manualmente adicionada dentre os primeiros em time de execução bibliotecas, suas chamadas iostream agora serão desfeitos.

Manipulação de exceção de C++ deve ser ativada para a biblioteca C++ padrão

Qualquer arquivo que usa a biblioteca C++ padrão deve ser compilado com tratamento de exceção de C++ habilitado.Para obter mais informações, consulte /GX.

Consulte também

Conceitos

Alterações de biblioteca C++ padrão