共用方式為


Standard C++ 程式庫變更:升級問題

更新:2007 年 11 月

下列主題討論使用早期的應用程式和新的執行階段程式庫可能會遭遇的困難。

  • iostream 實作中的差異

  • 在沒有預設程式庫下建置早期的專案

  • 必須對 Standard C++ 程式庫啟用 C++ 例外處理

iostream 實作中的差異

從 Visual C++ .NET 2003 開始,已移除舊的 iostream 程式庫。

Standard C++ 程式庫與先前的執行階段程式庫之間的主要差異在於 iostream 程式庫。iostream 實作的詳細資料已變更,如果您要與 Standard C++ 程式庫連結,可能必須重新撰寫程式碼中使用 iostream 的部分。

您將必須移除您在程式碼中包含的任何舊的 iostream 標頭 (fstream.h、iomanip.h、ios.h、iostream.h、istream.h、ostream.h、streamb.h 和 strstrea.h),並加入一或多個新的 Standard C++ iostream 標頭 (<fstream>、<iomanip>、<ios>、<iosfwd>、<iostream>、<istream>、<ostream>、<sstream>、<streambuf> 和 <strstream> 等,全部都沒有 .h 副檔名)。

下列清單說明新的 Standard C++ iostream 程式庫與舊的 iostream 程式庫不同的行為。

在新的 Standard C++ iostream 程式庫中:

  • open 函式不採用第三個參數 (保護參數)。

  • 您無法從檔案控制代碼 (File Handle) 建立資料流。

  • 新的 Standard C++ 程式庫中的所有名稱都在 std 命名空間中,但有幾個例外狀況。如需詳細資訊,請參閱使用 C++ Library 標頭

  • 您不能單以 ios::out 旗標開啟 ofstream 物件。ios::out 旗標必須以邏輯 OR 與另一個 ios 列舉值結合;例如,與 ios::inios::app

  • 在到達檔案結尾之後,ios::good 已不再傳回非零值,因為已設定 eofbit 狀態。

  • ios::setf (_IFlags) 不應與 ios::decios::octios::hex 旗標值一起使用,除非您知道目前並未設定任何基底旗標。已格式化的輸入/輸出函式和運算子會假定您只設定一個基底。請使用 ios_base 來代替。例如,setf (ios_base::oct,ios_base::basefield) 會清除所有的基底資訊,並將基底設為八進位。

  • ios::unsetf 傳回 void,而非先前的值。

  • 如果有錯誤,則 istream::get ( char& _Rch ) 不會指派給 Rch

  • istream::get( char* _Pch, int _Ncount, char_Delim ) 在下列三種情況下各有不同:

    • 如果未讀取任何資料,即設定 failbit

    • 在擷取字元後一律儲存 eos (無論結果如何都會進行此動作)。

    • _Ncount 的值為 -1 表示錯誤。

  • 具有無效參數的 istream::seekg 不會設定 failbit

  • 傳回型別 (Return Type) streampos 是一個多載運算子 (Overload Operator) 的類別。如果函式傳回一個 streampos 值 (例如 istream::tellgostream::tellpstrstreambuf::seekoffstrstreambuf::seekpos),您應將傳回值轉換成所需的型別:streamofffpos_tmbstate_t

  • strstreambuf::strstreambuf( _Falloc**,** _Ffree ) 中的第一個函式參數 (_Falloc) 採用 size_t 引數,而非 long

除了上述變更之外,下列舊 iostream 程式庫之項目的函式、常數和列舉值都已不是新 iostream 程式庫的項目:

  • filebuffstreamifstreamofstreamattach 成員 (Member) 函式

  • filebuffstreamifstreamofstreamfd 成員函式

  • filebuf::openprot

  • filebuf::setmode

  • ios::bitalloc

  • ios::nocreate

  • ios::noreplace

  • ios::sync_with_stdio

  • streambuf::out_waiting

  • streambuf::setbuf (使用 rdbuf -> pubsetbuf 會產生相同的行為)

在沒有預設程式庫下建置早期的專案

您可以在沒有預設程式庫下建置專案,方法為選取 /NODEFAULTLIB。如果您先前建立的專案沒有預設程式庫,而要嘗試 iostream 呼叫,您必須命名其中一個新的 Standard C++ Run-Time 程式庫 (Libcp.lib、Libcpmt.lib、Msvcprt.lib 等等) 或一個舊的 iostream Run-Time 程式庫 (Libci.lib、Libcimt.lib、Msvcirt.lib 等等),以便與適當的程式庫連結。

在舊版 Visual C++ (4.1 及更舊版本) 中,Run-Time 程式庫名稱為 Libc.lib、Libcmt.lib 和 Msvcrt.lib。這些程式庫包含舊的 iostream 程式庫。現在這些程式庫已移除舊的 iostream 程式庫。如果您不選擇忽略預設程式庫,並在程式碼中包含舊的 iostream 標頭檔,則依預設會連結舊的 iostream Run-Time 程式庫 (Libci.lib、Libcimt.lib、Msvcirt.lib 等等)。然而,如果您已選擇忽略預設程式庫,並已手動加入其中一個舊的執行階段程式庫,則目前的 iostream 呼叫將會中斷。

必須對 Standard C++ 程式庫啟用 C++ 例外處理

任何使用 Standard C++ 程式庫的檔案都必須已啟用 C++ 例外處理 (Exception Handling) 來編譯。如需詳細資訊,請參閱 /GX

請參閱

概念

Standard C++ 程式庫變更