Änderungen in der C++-Standardbibliothek: Aktualisierungsprobleme
Aktualisiert: November 2007
In den folgenden Themen werden Probleme erörtert, die beim Verknüpfen einer früheren Anwendung mit den neuen Laufzeitbibliotheken auftreten können.
Unterschiedliche iostream-Implementierungen
Frühere Projekte ohne Standardbibliotheken
C++-Ausnahmebehandlung muss für die C++-Standardbibliothek aktiviert sein
Unterschiedliche iostream-Implementierungen
Die alte iostream-Bibliothek wurde mit Einführung von Visual C++ .NET 2003 aus der Software entfernt.
Der Hauptunterschied zwischen der C++-Standardbibliothek und früheren Laufzeitbibliotheken besteht in der iostream-Bibliothek. Da Details der iostream-Implementierung geändert wurden, müssen Sie Codebereiche, die iostream verwenden, u. U. neu schreiben, wenn Sie eine Verknüpfung mit der C++-Standardbibliothek herstellen möchten.
Sie müssen alle im Code enthaltenen alten iostream-Header (fstream.h, iomanip.h, ios.h, iostream.h, istream.h, ostream.h, streamb.h und strstrea.h) entfernen und einen oder mehrere iostream-Header der neuen C++-Standardbibliothek (<fstream>, <iomanip>, <ios>, <iosfwd>, <iostream>, <istream>, <ostream>, <sstream>, <streambuf> und <strstream> ohne die Erweiterung .h) hinzufügen.
In der folgenden Liste ist beschrieben, welche iostream-Funktionen in der neuen C++-Standardbibliothek sich anders verhalten als in der alten iostream-Bibliothek.
Für die iostream-Funktionen der neuen C++-Standardbibliothek gilt:
open-Funktionen enthalten keinen dritten Parameter (Schutzparameter) mehr.
Streams können nicht aus Dateihandles erstellt werden.
Abgesehen von ein paar Ausnahmen befinden sich alle in der neuen C++-Standardbibliothek enthaltenen Namen im std-Namespace. Weitere Informationen finden Sie unter Verwenden von Headern der C++-Bibliothek.
Sie können ofstream-Objekte nicht mit dem ios::out-Flag allein öffnen. Das ios::out-Flag muss mit einem anderen ios-Enumerator in einem logischen OR-Befehl kombiniert werden, z. B. mit ios::in oder ios::app.
ios::good gibt nach dem Erreichen des Dateiendes keinen von Null abweichenden Wert mehr zurück, da der eofbit-Zustand gesetzt ist.
ios::setf(_IFlags) darf nur dann mit einem Flagwert von ios::dec, ios::oct oder ios::hex verwendet werden, wenn Sie wissen, dass momentan keines der Basisflags gesetzt ist. Die formatierten Ein-/Ausgabefunktionen und Operatoren nehmen an, dass nur eine Basis festgelegt ist. Verwenden Sie stattdessen ios_base. Beispielsweise werden durch setf(ios_base::oct,ios_base::basefield) alle Basisinformationen gelöscht und die Basis "oktal" eingestellt.
ios::unsetf gibt void anstelle des vorherigen Werts zurück.
Durch istream::get( char& _Rch ) erfolgt keine Rch-Zuweisung, wenn ein Fehler aufgetreten ist.
istream::get( char* _Pch, int _Ncount, char __Delim) unterscheidet sich in drei Punkten:
Wenn nichts gelesen wird, wird failbit gesetzt.
Ein eos wird stets (unabhängig vom Ergebnis) nach extrahierten Zeichen gespeichert.
Der Wert -1 für _Ncount gilt als Fehler.
istream::seekg mit ungültigem Parameter führt nicht dazu, dass failbit gesetzt wird.
Der streampos-Rückgabetyp ist eine Klasse mit überladenen Operatoren. In Funktionen, die einen streampos-Wert zurückgeben (z. B. istream::tellg, ostream::tellp, strstreambuf::seekoff und strstreambuf::seekpos), müssen Sie den Rückgabewert in den erforderlichen Typ umwandeln: streamoff, fpos_t oder mbstate_t.
Der erste Funktionsparameter (_Falloc) in strstreambuf::strstreambuf (_Falloc**,** _Ffree) enthält ein size_t-Argument und kein long-Argument.
Darüber hinaus sind die folgenden Funktionen, Konstanten und Enumeratoren zwar Elemente der alten iostream-Bibliothek, nicht aber der neuen iostream-Bibliothek.
attach-Memberfunktion von filebuf, fstreamifstream und ofstream
fd-Memberfunktion von filebuf, fstreamifstream und ofstream
filebuf::openprot
filebuf::setmode
ios::bitalloc
ios::nocreate
ios::noreplace
ios::sync_with_stdio
streambuf::out_waiting
streambuf::setbuf (verwenden Sie rdbuf -> pubsetbuf für denselben Zweck)
Frühere Projekte ohne Standardbibliotheken
Projekte können ohne Standardbibliotheken erstellt werden, indem Sie /NODEFAULTLIB auswählen. Falls das vorherige Projekt ohne Standardbibliotheken erstellt wurde und Sie iostream-Aufrufe ausführen möchten, müssen Sie eine der neuen C++-Standardlaufzeitbibliotheken (Libcp.lib, Libcpmt.lib, Msvcprt.lib usw.) oder eine der alten iostream-Laufzeitbibliotheken (Libci.lib, Libcimt.lib, Msvcirt.lib usw.) benennen, um eine Verknüpfung mit der richtigen Bibliothek zu erstellen.
In früheren Visual C++-Versionen (4.1 und früher) hatten die Laufzeitbibliotheken die Namen Libc.lib, Libcmt.lib und Msvcrt.lib. Diese Bibliotheken enthielten die alte iostream-Bibliothek. Die alte iostream-Bibliothek wurde jetzt aus diesen Bibliotheken entfernt. Wenn Sie festlegen, dass die Standardbibliotheken nicht ignoriert werden sollen, und alte iostream-Headerdateien in den Code einfügen, werden die alten iostream-Laufzeitbibliotheken (Libci.lib, Libcimt.lib, Msvcirt.lib usw.) standardmäßig verknüpft. Wenn Sie jedoch festgelegt haben, dass Standardbibliotheken ignoriert werden sollen, und eine der früheren Laufzeitbibliotheken manuell hinzugefügt haben, wird die Ausführung durch die iostream-Aufrufe unterbrochen.
C++-Ausnahmebehandlung muss für die C++-Standardbibliothek aktiviert sein
Jede Datei, die die C++-Standardbibliothek verwendet, muss mit aktivierter C++-Ausnahmebehandlung kompiliert werden. Weitere Informationen finden Sie unter /GX.