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

本文提供有关标准 c + + 库以及这些问题的答案的常见问题(Faq)列表。

原始产品版本:  Visual c + +
原始 KB 数:  154419

问题1:标准 c + + 库包含什么

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

标准 c + + 库可以分为以下几类:

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

    • 容器:支持常用方式组织数据的模板类,如、、、、、 vector list deque stack queue setmap

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

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

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

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

    • 语言支持:在整个库中使用的常用类型定义的组件( cstddef ,预定义类型的特征( limitscfloatclimits )、支持开始和终止 c + + 程序()的功能、对动态内存管理的支持()、对动态类型标识的支持()、对 cstdlib new typeinfo 异常处理的支持()以及对异常处理的支持( exception 、、 cstdarg ctime csetlmpcsignal )。

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

    • 字符串:字符串类( string )和空终止序列实用程序( cctypecwctype ,)的组件 cwchar

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

问题2: CRT 和标准 c + + 库之间有何区别? 运行时库编译器选项包括的库有哪些?

Visual c + + 包含以下库以及 Microsoft 基础类(MFC)库:

  • 基本 C 运行时库
  • 标准 c + + 库
库类型和相关编译器开关 基本 C 运行时库/标准 c + + 库
单线程(/ML) LIBC.LIB/LIBCP。LIB
调试单线程(/MLd) LIBCD.LIB/LIBCPD。LIB
多线程(/MT) LIBCMT.LIB/LIBCPMT。LIB
调试多线程(/MTd) LIBCMTD.LIB/LIBCPMTD。LIB
多线程 DLL (/MD) MSVCRT.LIB/MSVCPRT。LIB
调试多线程/DLL (MDd) MSVCRTD.LIB/MSVCPRTD。LIB

备注

  • 在 Visual c + + 中,已删除静态单线程库的 /ML/MLd库编译器选项。
  • MSVCPRTMSVCPRTD是静态库,没有与它们直接相关的动态链接库(dll)。 这些库也分别依赖于MSVCRTMSVCRTD。 如果您有任何应用程序使用MSVCPRTMSVCPRTD ,并且您使用Ignore Default Library/NODNODEFAULTLIB)选项,请务必将MSVCPRT (或 MSVCPRTD)和 MSVCRT (或MSVCRTD)与应用程序链接。 否则,在链接您的应用程序时,将会收到链接器错误(LNK2001: MSVCPRT 或 MSVCPRTD 中未解析的外部程序)。 根据代码中使用的标头,来自标准 c + + 库的库也可能会链接。

头文件use_ansi包含 #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 四维

问题3:如果我的项目来自早期版本,如何在 Visual c + + .NET 2003 或更早版本中保留旧的 iostream 功能

如果要保留旧 iostream 库(iostream),请在代码中添加一个或多个旧的 iostream 头文件。 请勿使用新的标准 c + + 头。 您不能将调用混合到旧 iostream 库和新的标准 c + + 库。

问题4:如何将标准 c + + 库设为应用程序的默认库

如果要将标准 c + + 库设置为默认库,请包含一个或多个新的标准 c + + 头。 您不能将调用混合到旧的 iostream 和新的标准 c + + 库。 必须修改使用旧函数的现有库(静态或动态链接), iostream 才能使用标准 c + + 库 iostream 函数。

问题5:将在 MFC 应用程序中使用标准 c + + 库会导致与 C 运行时库发生冲突

否。 Microsoft 基础类(MFC)不使用任何将与标准 c + + 库冲突的 C 运行时函数。

问题6:尽管我已包括 iostream,为什么遇到错误(错误 C2065: ' cout ':未声明的标识符)

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

using namespace std;

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

问题7:为什么我会收到错误(编译器错误 C2371: "标识符" 重定义; 不同的基本类型)

在 visual c + + 2005 之前的 Visual c + + 版本中,混合标准 c + + 标头和旧 iostream 标头会导致此错误,即使它们包含在不同的源文件中也是如此。 以下是不同的标头:

  • iostream 标头:

    列1 列2
    FSTREAM.水平 IOMANIP.水平
    IOS.水平 IOSTREAM.水平
    ISTREAM.水平 OSTREAM.水平
    STDIOSTR.水平 STREAMB.水平
    STRSTREA.水平
  • 标准 c + + 头:

    列1 列2 第3列 列4
    法则 BITSET 复杂 DEQUE
    异常 FSTREAM 完善 IOMANIP
    IOS IOSFWD IOSTREAM ISTREAM
    迭代 限额 簿 位置
    对应 不足 位数 OSTREAM
    列队 SSTREAM 叠放
    STDEXCEPT STREAMBUF STRING STRSTREAM
    TYPEINFO 程序 VALARRAY 四维

问题8:为什么我会收到邮件(LNK2001:无法解析的外部符号 ' symbol ';)当使用 "忽略默认库" 生成项目时,iostream 函数调用

iostream函数已从 C 运行时库中删除。

如果使用的是旧 iostream 函数,则必须添加其他库LIBCI (单线程ML)、 LIBCIMT (多线程MT)或MSVCIRT (多线程 dll MD)。 这些库已从 Visual c + + 中删除。

如果使用 iostream 的是标准 c + + 库附带的新函数,则必须添加其他库LIBCP (单线程ML)、 LIBCPMT (多线程MT)或MSVCPRT (多线程 dll MD)。

不要混合使用不同版本的库。 例如,如果您使用的是单线程版本的 C 运行时库,则还必须使用旧 iostream 库或标准 c + + 库的单线程版本。

您不能将调用与旧的 iostream 库函数和新的标准 c + + 库函数混合在一起 iostream

问题9:为什么我会收到编译器警告 C4786 或 C4788? 我的程序中没有任何符号的长度接近255个字符

当符号名称长度超过255个字符时,将发出 C4786 或 C4788。 这通常发生在模板类中,并 STL 广泛使用 template 类。

忽略此警告是安全的。 使用 #pragma 警告(disable:4786,4788)禁止显示邮件。

问题10:为什么我会收到消息(C4530:使用了 c + + 异常处理程序,但未启用展开语义。 指定-GX)

使用标准 c + + 库的程序必须在启用 c + + 异常处理的情况编译时进行编译。 可以通过以下方法之一来启用 c + + 异常处理:

  • 在 "项目设置" 对话框中 " c/c + + " 选项卡的 "c + + 语言" 类别中,选择 "启用异常处理" 选项。
  • 使用 /gx编译器开关。

问题11:为什么我会收到编译器错误 C2146,后跟 C2065,最后 C2143,都指向我的源中的同一行

此错误序列可能由以下类型的构造引起:

vector<int, allocator<int>>iV;

该问题是由声明末尾的连续点引起的 >> 。 解决方案是在两个字符之间添加空格,因此构造将变为:

vector<int, allocator<int> > iV;

这与建议的 ANSII 规范一致。