標準 C++ ライブラリの変更点 : アップグレードに関する問題
更新 : 2007 年 11 月
以前のバージョンのアプリケーションと新しいランタイム ライブラリを使用したときに発生する問題については、以下のトピックで説明しています。
入出力ストリームの実装の相違点
既定のライブラリを使用せずにビルドした以前のバージョンのプロジェクト
標準 C++ ライブラリに必要な C++ 例外処理
入出力ストリームの実装の相違点
古い iostream ライブラリは、Visual C++ .NET 2003 以降では削除されています。
標準 C++ ライブラリと従来のランタイム ライブラリの最大の相違点は、iostream ライブラリにあります。入出力ストリームの実装は細部が変更されたため、標準 C++ ライブラリとリンクするときには、入出力ストリームを使用するコードの書き直しが必要になる場合があります。
コードにインクルードした古い入出力ストリーム ヘッダー ファイル (fstream.h、iomanip.h、ios.h、iostream.h、istream.h、ostream.h、streamb.h、および strstrea.h) を削除し、新しい標準 C++ の 1 つ以上の入出力ストリーム ヘッダー ファイル (<fstream>、<iomanip>、<ios>、<iosfwd>、<iostream>、<istream>、<ostream>、<sstream>、<streambuf>、および <strstream>) を追加する必要があります。これらのファイルはいずれも拡張子 .h が付いていません。
新しい標準 C++ iostream ライブラリと古い iostream ライブラリでは、動作に以下の違いがあります。
新しい標準 C++ iostream ライブラリの動作は次のとおりです。
open 関数は 3 番目の保護パラメータをとりません。
ファイル ハンドルからストリームを作成できません。
2 つの例外を除き、新しい標準 C++ ライブラリのすべての名前は std 名前空間にあります。詳細については、「Using C++ Library Headers」を参照してください。
ios::out フラグを指定しただけで ofstream オブジェクトを開くことはできません。ios::out フラグは、ios::in や ios::app などの別の ios列挙子と論理 OR で組み合わせる必要があります。
ios::good は、EOF (end-of-file) に達した後で eofbit 状態が設定されるため、0 以外の値を返しません。
ios::setf(_IFlags) で基数フラグ ios::dec、ios::oct、または ios::hex を指定できるのは、それらのフラグがいずれも設定されていないときだけです。書式付き入出力関数と演算子は、基数が 1 つだけ設定されているものと仮定します。代わりに、ios_base を使用します。たとえば、setf( ios_base::oct,ios_base::basefield ) はすべての基数情報を消去してから、基数を 8 進数に設定します。
ios::unsetf は、直前の値を返すのではなく void を返します。
istream::get( char& _Rch ) では、エラーが発生した場合には Rch に何も格納しません。
istream::get( char* _Pch, int _Ncount, char_Delim ) は、次の 3 とおりの動作を行います。
何も読み取られなかった場合は failbit が設定されます。
文字を読み取った後、常に eos が格納されます。これは、結果に関係なく行われます。
_Ncount の値が -1 の場合はエラーとなります。
istream::seekg は、無効なパラメータを指定しても failbit を設定しません。
戻り値の型 streampos は、オーバーロードされた演算子を持つクラスです。streampos の値を返す istream::tellg、ostream::tellp、strstreambuf::seekoff、strstreambuf::seekpos などの関数では、戻り値を streamoff、fpos_t、または mbstate_t の必要な型にキャストする必要があります。
strstreambuf::strstreambuf( _Falloc**,** _Ffree ) の関数の最初の引数 (_Falloc) は、long ではなく、size_t です。
上に示した変更のほかにも、次に示す古い iostream ライブラリの関数、定数、および列挙子は、新しい iostream ライブラリの要素ではありません。
filebuf、fstream、ifstream、および ofstreamのメンバ関数 attach
filebuf、fstream、ifstream、および ifstreamのメンバ関数 fd
filebuf::openprot
filebuf::setmode
ios::bitalloc
ios::nocreate
ios::noreplace
ios::sync_with_stdio
streambuf::out_waiting
streambuf::setbuf (同じ動作には rdbuf -> pubsetbuf を使用)
既定のライブラリを使用せずにビルドした以前のバージョンのプロジェクト
/NODEFAULTLIB を指定すると、既定のライブラリを使用せずにプロジェクトをビルドできます。以前のバージョンのプロジェクトが既定のライブラリを使用せずにビルドされ、入出力ストリームの呼び出しを行う場合、該当するライブラリとリンクするには、新しい標準 C++ ランタイム ライブラリ (Libcp.lib、Libcpmt.lib、Msvcprt.lib など) の 1 つ、または古い入出力ストリーム ランタイム ライブラリ (Libci.lib、Libcimt.lib、Msvcirt.lib など) の 1 つを指定する必要があります。
Visual C++ Versions 4.1 以前では、ランタイム ライブラリ名は Libc.lib、Libcmt.lib、および Msvcrt.lib でした。これらのライブラリは、古い iostream ライブラリを含んでいました。現在のバージョンでは、古い iostream ライブラリはこれらのライブラリから削除されています。既定のライブラリを無視するオプションを選択せずに古い入出力ストリーム ヘッダー ファイルをコードにインクルードすると、既定では Libci.lib、Libcimt.lib、Msvcirt.lib などの古い入出力ストリーム ランタイム ライブラリがリンクされます。しかし、既定のライブラリを無視するオプションを選択して、以前のバージョンのランタイム ライブラリの 1 つを手動で追加すると、入出力ストリームの呼び出しは失敗します。
標準 C++ ライブラリに必要な C++ 例外処理
標準 C++ ライブラリを使用するすべてのファイルは、C++ 例外処理を有効にしてコンパイルする必要があります。詳細については、「/GX」を参照してください。