標準 C++ 連結庫的常見問題

本文提供常見問題的清單, (常見問題) 標準 C++ 連結庫的相關信息,以及這些問題的解答。

原始產品版本: Visual C++
原始 KB 編號: 154419

標準 C++ 連結庫包含的內容

標準 C++ 連結庫提供可延伸的架構,並包含語言支援、診斷、一般公用程式、字串、地區設定、標準範本連結庫 (容器、反覆運算器、演算法和數值) ,以及輸入/輸出的元件。

標準 C++ 連結庫可以分成下列類別:

  1. 標準範本連結庫 (STL) 元件提供 C++ 程式,可存取最廣泛使用的演算法和數據結構子集。 STL 標頭可分為三個主要組織概念:

    • 容器:支援組織資料常見方式的範本類別,例如vectorlist、、dequestackqueuesetmap

    • 演算法:範本函式,用於對物件序列執行一般作業,例如功能、演算法和數值。

    • 反覆運算器:將演算法和容器貼在一起的黏附,例如公用程式、反覆運算器和記憶體。

  2. 輸入/輸出包含 () iosfwd 的向前宣告iostreams、預先定義iostreams的物件 () iostream 、基iostreams類 () ios 、串流緩衝 () streambuf 、串流格式設定和操作工具 (iosmanip、、ostreamistream) 、字元串數據流 (sstream) ,以及檔案數據流 () fstream 的元件。

  3. 其他標準 C++ 標頭包括:

    • 語言支援:用於連結庫 () cstddef 之通用類型定義的元件、 預先定義的類型特性, (limitscfloatclimits) 、支援 C++ 程式 () cstdlib 啟動和終止的函式、動態記憶體管理 (new) 的支援、動態類型識別 (typeinfo) 的支援、例外狀況處理 (exception) 的支援,以及其他運行時間支援 (cstdargctimecsetlmpcsignal) 。

    • 診斷:用於報告數種例外狀況 () stdexcept 、記錄程式判斷提示 () cassert 的元件,以及 () 錯誤碼的 cerrno 全域變數。

    • 字串:字串類別 () string 的元件,以及 (、cwctypecwchar) cctype的 null 終止序列公用程式。

    • 當地語系化:C++ 程式可用來封裝文化差異的元件。 地區設定設施包含字元分類和字串定序、數值、貨幣、日期/時間格式設定和剖析的國際化支援,以及 (localeclocale) 的訊息擷取。

CRT 與標準 C++ 連結庫之間有何差異? 運行時間連結庫編譯程式選項將包含哪些連結庫

除了 Microsoft Foundation Classes (MFC) 連結庫之外,Visual C++ 還包含下列連結庫:

  • 基本 C 執行時間連結庫
  • 標準 C++ 連結庫
連結庫類型和相關的編譯程序參數 基本 C 執行時間連結庫/ 標準 C++ 連結庫
單個線程 (/ML) LIBC。LIB / LIBCP。自由
偵錯單個線程 (/MLd) LIBCD。LIB / LIBCPD。自由
多線程 (/MT) LIBCMT。LIB / LIBCPMT。自由
偵錯多線程 (/MTd) LIBCMTD。LIB / LIBCPMTD。自由
多線程 DLL (/MD) MSVCRT。LIB / MSVCPRT。自由
偵錯多線程 /DLL (MDd) MSVCRTD。LIB / MSVCPRTD。自由

注意事項

  • Visual C++ 中已移除靜態單個線程連結庫的 /ML/MLd 連結庫編譯程序選項。
  • MSVCPRT.libMSVCPRTD.lib 是靜態連結庫, (DLL) 沒有任何直接相關聯的動態連結庫。 這些連結庫也分別相依於 MSVCRT.libMSVCRTD.lib。 如果您有任何應用程式使用 MSVCPRT.libMSVCPRTD.lib ,而且您使用 [ 忽略默認 連結庫 (/NODNODEFAULTLIB) ] 選項,請務必將 MSVCPRT.lib (或 MSVCPRTD.lib) 和 MSVCRT.lib (或 MSVCRTD.lib) 與您的應用程式連結。 否則,您會在連結應用程式時收到鏈接器錯誤 (LNK2001:MSVCPRT.lib 或 MSVCPRTD.lib) 中無法解 析的外部專案。 根據您在程式代碼中使用的標頭,標準 C++ 連結庫中的連結庫也可能會連結。

標頭檔 use_ansi.h 包含 #pragma 強制連結標準 C++ 連結庫的語句。 所有標準 C++ 標頭都包含 use_ansi.h:如果您在應用程式中包含任何標準 C++ 標頭,則預設會連結標準 C++ 連結庫。

標準 C++ 標頭

欄 1 欄 2 欄 3 欄 4
演算法 BITSET 複雜 DEQUE
例外 FSTREAM 功能 IOMANIP
Ios IOSFWD IOSTREAM ISTREAM
反覆運算 限制 清單 現場
地圖 記憶 數位 OSTREAM
佇列 設置 SSTREAM 堆疊
STDEXCEPT STREAMBUF STRING STRSTREAM
TYPEINFO 實用 VALARRAY 向量

如果我從舊版移植專案,如何從 Visual C++ .NET 2003 或更早版本保留舊的 'iostream' 功能

如果您想要將舊 iostream 的連結庫保留 (iostream.h) ,請在程式代碼中包含一或多個舊 iostream 頭檔。 請勿使用新的標準 C++ 標頭。 您無法混用對舊 iostream 連結庫和新標準 C++ 連結庫的呼叫。

如何讓標準 C++ 連結庫成為應用程式的預設連結庫

如果您想要將標準 C++ 連結庫設為預設值,請包含一或多個新的標準 C++ 標頭。 您無法混用對舊 iostream 版和新標準 C++ 連結庫的呼叫。 使用舊 iostream 函式的現有連結庫 (靜態或動態連結) 必須修改為使用標準 C++ 連結庫 iostream 函式。

如果我在 MFC 應用程式中使用標準 C++ 連結庫,是否會與 C 執行時間連結庫發生衝突

不能。 Microsoft Foundation Classes (MFC) 不會使用任何會與標準 C++ 連結庫衝突的 C 運行時間函式。

為什麼我收到錯誤 (錯誤 C2065: ''cout'': 未宣告的標識符) 即使我已包含 'iostream'

標準 C++ 連結庫會在自己的命名空間 std中實作。 請務必在程序的開頭新增下列語句:

using namespace std;

或使用命名空間std來限定每個標準 C++ 連結庫識別碼,例如 std::cout

為什麼我收到錯誤 (編譯程序錯誤 C2371: 'identifier' redefinition;不同的基本類型)

在 Visual C++ 2005 之前的 Visual C++ 版本中,混合標準 C++ 標頭和舊 iostream 標頭會導致此錯誤,即使它們包含在不同的原始程式檔中也一樣。 以下是不同的標頭:

  • iostream 標頭:

    欄 1 欄 2
    FSTREAM。H IOMANIP。H
    Ios。H IOSTREAM。H
    ISTREAM。H OSTREAM。H
    STDIOSTR。H STREAMB。H
    STRSTREA。H
  • 標準 C++ 標頭:

    欄 1 欄 2 欄 3 欄 4
    演算法 BITSET 複雜 DEQUE
    例外 FSTREAM 功能 IOMANIP
    Ios IOSFWD IOSTREAM ISTREAM
    反覆運算 限制 清單 現場
    地圖 記憶 數位 OSTREAM
    佇列 設置 SSTREAM 堆疊
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO 實用 VALARRAY 向量

為什麼我會收到訊息 (LNK2001:無法解析的外部符號 'symbol';) 'iostream' 函式會在使用 [忽略默認連結庫] 建置專案時呼叫

iostream 式已從 C-Runtime 連結庫中移除。

如果您使用舊 iostream 函式,則必須新增另一個連結庫 LIBCI.lib (單個線程 ML) 、 LIBCIMT.lib (多線程 MT) 或 MSVCIRT.lib (多線程 dll MD) 。 這些連結庫已從 Visual C++ 中移除。

如果您使用標準 C++ 連結庫隨附的新 iostream 函式,則必須新增另一個連結庫 LIBCP.lib (單個線程 ML) 、 LIBCPMT.lib (多線程 MT) 或 MSVCPRT.lib (多線程 dll MD) 。

請勿混合不同版本的連結庫。 例如,如果您使用 C-Runtime 連結庫的單個線程版本,則也必須使用舊 iostream 連結庫或標準 C++ 連結庫的單個線程版本。

您無法混合呼叫舊 iostream 的連結庫函式和新的標準 C++ 連結庫 iostream 函式。

為什麼我會收到編譯程式警告 C4786 或 C4788? 我的程序中沒有任何符號長度接近 255 個字元

當符號的名稱長度超過 255 個字元時,就會發出 C4786 或 C4788。 此問題通常會發生在範本類別,並 STL 廣泛使用範本類別。

忽略此警告是安全的。 #pragma使用警告 (停用:4786,4788) 來隱藏訊息。

為什麼我收到訊息 (C4530:使用 C++ 例外狀況處理程式,但未啟用回溯語意。指定 -GX)

使用標準 C++ 連結庫的程式必須編譯,並啟用 C++ 例外狀況處理。 下列其中一種方法可以啟用 C++ 例外狀況處理:

  • 在 [項目設定] 對話框中,選取 [C/C++] 索引標籤之 C++ 語言類別目錄中的 [啟用例外狀況處理] 選項。
  • 使用 /GX 編譯程序參數。

為什麼我收到編譯程序錯誤 C2146,後面接著 C2065,最後是 C2143,全都指向來源中的同一行

下列類型的建構可能會造成這一連串的錯誤:

vector<int, allocator<int>>iV;

此問題是由宣告結尾的連續 >> 所造成。 解決方案是在兩個字元之間放置空格,讓建構變成:

vector<int, allocator<int> > iV;

它與建議的 ANSII 規格一致。