Modifications apportées à la bibliothèque C++ standard : problèmes de mise à niveau
Mise à jour : novembre 2007
Les rubriques suivantes décrivent les difficultés que vous pouvez rencontrer en utilisant les nouvelles bibliothèques Runtime avec une ancienne application.
Différences dans l'implémentation de la bibliothèque iostream
Anciens projets créés sans bibliothèques par défaut
La gestion des exceptions C++ doit être activée pour la bibliothèque C++ standard
Différences dans l'implémentation de la bibliothèque iostream
L'ancienne bibliothèque iostream sera supprimée à partir de Visual C++ .NET 2003.
La principale différence entre la bibliothèque C++ standard et les anciennes bibliothèques Runtime concerne la bibliothèque iostream. Les détails de l'implémentation de iostream ont changé et il peut s'avérer nécessaire de réécrire les parties de votre code qui utilisent iostream si vous souhaitez créer un lien avec la bibliothèque C++ standard.
Vous devrez supprimer tous les anciens en-têtes iostream (fstream.h, iomanip.h, ios.h, iostream.h, istream.h, ostream.h, streamb.h et strstrea.h) que vous avez inclus dans votre code et ajouter un ou plusieurs des nouveaux en-têtes iostream C++ standard (<fstream>, <iomanip>, <ios>, <iosfwd>, <iostream>, <istream>, <ostream>, <sstream>, <streambuf> et <strstream>, sans l'extension .h).
La liste suivante décrit les différences de comportement entre la nouvelle bibliothèque iostream C++ standard et l'ancienne bibliothèque iostream.
Dans la nouvelle bibliothèque iostream C++ standard :
Les fonctions d'ouverture n'acceptent pas un troisième paramètre (le paramètre de protection).
Vous ne pouvez pas créer des flux à partir des handles de fichier.
À part quelques exceptions, tous les noms dans la nouvelle bibliothèque C++ standard sont dans l'espace de noms std. Pour plus d'informations, consultez Utilisation des en-têtes de la bibliothèque C++.
Vous ne pouvez pas ouvrir des objets ofstream avec le seul indicateur ios::out. L'indicateur ios::out doit être combiné avec un autre énumérateur ios dans un opérateur logique OR; par exemple, avec ios::in ou ios::app.
ios::good ne retourne plus une valeur non-zéro lorsque la fin du fichier est atteinte, car l'état eofbit est défini.
Vous ne devez pas utiliser ios::setf(_IFlags) avec une valeur d'indicateur ios::dec, ios::oct ou ios::hex, sauf si vous savez qu'aucun des indicateurs de base n'est actuellement défini. Les fonctions d'entrée/sortie mises en forme et les opérateurs présupposent la définition d'une seule base. Utilisez plutôt ios_base. Par exemple, setf( ios_base::oct,ios_base::basefield ) supprime toutes les informations relatives à la base et définit celle-ci comme une valeur octale.
ios::unsetf retourne void à la place de la valeur précédente.
istream::get( char& _Rch ) n'assigne rien à Rch en cas d'erreur.
istream::get( char* _Pch, int _Ncount, char_Delim) est différent sur trois points :
Lorsque rien n'est lu, failbit est défini.
Un eos est toujours stocké après des caractères extraits (quel que soit le résultat).
Une valeur de -1 pour _Ncount correspond à une erreur.
istream::seekg avec un paramètre non valide ne définit pas failbit.
Le type de retour streampos est une classe avec des opérateurs surchargés. Dans les fonctions qui retournent une valeur streampos (telles istream::tellg, ostream::tellp, strstreambuf::seekoff et strstreambuf::seekpos), vous devez effectuer un cast sur la valeur de retour dans le type requis : streamoff, fpos_t ou mbstate_t.
Le premier paramètre de fonction (_Falloc) dans strstreambuf::strstreambuf( _Falloc**,** _Ffree ) prend un argument size_t, et non long.
Outre les changements décrits ci-dessus, les fonctions, constantes et énumérateurs suivants, qui sont des éléments de l'ancienne bibliothèque iostream, ont disparu dans nouvelle bibliothèque iostream :
fonction membre attach defilebuf, fstreamifstreamet ofstream
fonction membre fd de filebuf, fstreamifstream et ofstream
filebuf::openprot
filebuf::setmode
ios::bitalloc
ios::nocreate
ios::noreplace
ios::sync_with_stdio
streambuf::out_waiting
streambuf::setbuf (utilisez rdbuf -> pubsetbuf pour le même comportement)
Anciens projets créés sans bibliothèques par défaut
Vous pouvez créer un projet sans bibliothèques par défaut en sélectionnant /NODEFAULTLIB. Si votre ancien projet a été créé sans bibliothèques par défaut et que vous souhaitez appeler iostream, vous devez nommer l'une des nouvelles bibliothèques Runtime C++ standard (Libcp.lib, Libcpmt.lib, Msvcprt.lib, etc.) ou l'une des anciennes bibliothèques Runtime iostream (Libci.lib, Libcimt.lib, Msvcirt.lib, etc.) pour créer un lien avec la bibliothèque appropriée.
Dans les anciennes versions de Visual C++ (4.1 et antérieures), les bibliothèques Runtime étaient nommées Libc.lib, Libcmt.lib et Msvcrt.lib. Ces bibliothèques incluaient l'ancienne bibliothèque iostream. L'ancienne bibliothèque iostream a maintenant été retirée de ces bibliothèques. Si vous ne choisissez pas d'ignorer les bibliothèques par défaut et incluez les anciens fichiers d'en-tête iostream dans votre code, les anciennes bibliothèques Runtime iostream (Libci.lib, Libcimt.lib, Msvcirt.lib, etc.) sont associées par défaut. Mais si vous avez choisi d'ignorer les bibliothèques par défaut et ajouté manuellement l'une des anciennes bibliothèques Runtime, vos appels à iostream seront désormais inopérants.
La gestion des exceptions C++ doit être activée pour la bibliothèque C++ standard
Vous devez activer la gestion des exceptions C++ pour compiler un fichier, dès lors qu'il utilise la bibliothèque C++ standard. Pour plus d'informations, consultez /GX.