兼容性

通用 C 运行时库 (UCRT) 支持实现 C++ 一致性所需的大多数 C 标准库。 它实现 C99 (ISO/IEC 9899:1999) 库,但有一些异常:

  • complex.h<> 中严格的类型兼容性。
  • 不太可能实现 aligned_alloc,因为 Windows 操作系统不支持对齐的分配。 请改用非标准 _aligned_malloc
  • strerrorlen_s
  • stdatomic.h 中的原子支持<>
  • thread.h 中的线程支持<>

UCRT 还实现了 POSIX.1(ISO/IEC 9945-1:1996,POSIX 系统应用程序编程接口)C 库的大型子集。 但不完全符合任何特定的 POSIX 标准。 UCRT 还实现了几个特定于 Microsoft 的函数和不属于标准的一部分的宏。

在 vcruntime 库中找到了特定于 Visual C++ 的 Microsoft 实现的函数。 这些函数中的许多函数都适用于内部使用,且不能通过用户代码调用。 记录了一些函数,以供调试和实现兼容性时使用。

C++ 标准将全局命名空间中以下划线开头的名称保留到实现中。 POSIX 函数和特定于 Microsoft 的运行时库函数都位于全局命名空间中,但不属于标准 C 运行时库。 这就是为什么这些函数的首选 Microsoft 实现具有前导下划线的原因。 为了便于移植,UCRT 还支持默认名称,但使用它们编译代码时,Microsoft C++ 编译器会发出弃用警告。 仅会弃用默认名称,而不会弃用函数本身。 若要取消警告,在使用原始 POSIX 名称的代码中包含任何标头之前,请定义 _CRT_NONSTDC_NO_WARNINGS 。 由于 C 标准不允许标头文件中含有非标准名称,因此默认情况下 /std:c11/std:c17 不会公开 POSIX 函数、类型和宏的默认名称。 如果需要这些名称,请定义 _CRT_DECLARE_NONSTDC_NAMES 以公开它们。

由于误用参数和未检查缓冲区,标准 C 库中的某些函数具有不安全的使用情况历史记录。 这些函数通常是代码中出现的安全问题的来源。 Microsoft 创建了一组更安全版本的函数来验证参数使用情况。 在运行时检测到问题时,它们调用无效的参数处理程序。 默认情况下,如果使用的函数具有更加安全的变体,Microsoft C++ 编译器会发出弃用警告。 当编译 C++ 代码时,你可以将 _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 定义为 1,以消除大多数警告。 此宏允许模板重载调用更加安全的变体,同时保持可移植的源代码。 若要取消警告,在使用这些函数的代码中包含任何标头之前,请定义 _CRT_SECURE_NO_WARNINGS 。 有关详细信息,请参阅 CRT 中的安全功能。

除非文档中对特定函数另有注明,否则 UCRT 与 Windows API 可兼容。 某些函数在 Windows 应用商店或通用 Windows 平台 (UWP) 应用中不受支持。 这些函数列在通用 Windows 平台应用中不支持的 CRT 函数中。

Title 说明
UWP 应用、Windows 运行时和 C 运行时 说明 UCRT 例程何时与通用 Windows 应用或 Microsoft 应用商店应用不兼容。
ANSI C 一致性 介绍 UCRT 中符合标准的名称。
UNIX 提供将程序移植到 UNIX 的指南。
Windows 平台 (CRT) 列出 CRT 支持的操作系统。
后向兼容性 描述如何将旧 CRT 名称映射到新名称。
C 运行时 (CRT) 和 C++ 标准库 (STL) .lib 文件 提供 CRT 库 (.lib) 文件和关联的编译器选项的概述。