有关标准 C++ 库的常见问题

本文提供了有关标准 C++ 库的常见问题 (常见问题解答) 列表,以及这些问题的解答。

原始产品版本: Visual C++
原始 KB 编号: 154419

标准 C++ 库包含哪些内容

标准 C++ 库提供可扩展的框架,包含语言支持、诊断、常规实用工具、字符串、区域设置、标准模板库 (容器、迭代器、算法和数字) 以及输入/输出的组件。

标准 C++ 库可分为以下类别:

  1. 标准模板库 (STL) 组件为 C++ 程序提供对最广泛使用的算法和数据结构的子集的访问权限。 STL 标头可分为三个主要组织概念:

    • 容器:支持组织数据的常见方法的模板类,例如 vector、、listdequestackqueueset、 和 map

    • 算法:用于对对象序列(如函数、算法和数值)执行常见操作的模板函数。

    • 迭代器:将算法和容器(例如实用工具、迭代器和内存)粘贴在一起的粘附。

  2. 输入/输出包括 () iosfwd 的向前声明iostreams组件、预定义iostreams对象 () iostream 、基iostreams类 (ios) 、流缓冲 (streambuf) 、流格式设置和操作器 (iosmanipistreamostream) 、字符串流 () sstream ,以及) (fstream 文件流。

  3. 其他标准 C++ 标头包括:

    • 语言支持:用于整个库 () cstddef 的常见类型定义的组件、预定义类型 (limits的特征、 cfloatclimits) 、支持启动和终止 C++ 程序 (cstdlib) 的函数、支持动态内存管理 (new) 、支持动态类型标识 (typeinfo) 、支持异常处理 (exception) 以及其他运行时支持 (cstdargctimecsetlmpcsignal) 。

    • 诊断:用于报告多种异常情况的组件 (stdexcept) 、记录程序断言 (cassert) ,以及错误代码 () cerrno 的全局变量。

    • 字符串:字符串类的组件 (string) 和以 null 结尾的序列实用工具 (cctypecwctypecwchar) 。

    • 本地化:C++ 程序可用于封装文化差异的组件。 区域设置设施包括字符分类和字符串排序规则、数字、货币和日期/时间格式设置和分析的国际化支持,以及消息检索 (localeclocale) 。

CRT 库与标准 C++ 库之间的区别是什么? 运行时库编译器选项将包括哪些库

Visual C++ 除了 Microsoft 基础类 (MFC) 库外,还包括以下库:

  • 基本 C-Runtime 库
  • 标准 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++ 库和新标准 C++ 库的调用。 使用旧 iostream 函数 (静态或动态链接) 的现有库必须修改为使用标准 C++ 库 iostream 函数。

如果我在 MFC 应用程序中使用标准 C++ 库,是否会导致与 C-Runtime 库冲突

否。 Microsoft 基础类 (MFC) 不使用任何与标准 C++ 库冲突的 C-Runtime 函数。

为什么我收到错误 (错误 C2065: “'cout”' : 未声明的标识符) ,即使我已包含“iostream”

标准 C++ 库在其自己的命名空间 std中实现。 请确保在程序的开头添加以下语句:

using namespace std;

或者使用命名空间 std限定每个标准 C++ 库标识符,例如 std::cout

为什么我收到错误 (编译器错误 C2371:“identifier”重新定义;不同的基本类型)

在早于 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 规范一致。