兼容性
通用 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) 文件和关联的编译器选项的概述。 |