msvcrt、ucrt和vcruntime库之间的区别

25

请问有人能解释一下它们的区别吗?我在网上查了很多,但还是感到困惑。

我正在使用VS2019。

1个回答

43

MSVCRT和UCRT是Microsoft Windows上C标准库的两个变体。

MSVCRT(Microsoft Visual C++ Runtime)在所有Microsoft Windows版本中默认可用,但由于向后兼容性问题而停滞不前,不支持C99并且缺少一些功能。

  • 例如printf()函数族不支持C99,但是mingw-w64提供了替代函数以在许多情况下支持C99
  • 它不支持UTF-8语言环境
  • 使用MSVCRT链接的程序二进制文件不应与UCRT链接的混合使用,因为内部结构和数据类型是不同的。 MSVC编译的程序二进制文件也适用相同的规则,默认情况下使用UCRT(如果未更改)。
  • 在每个Microsoft Windows版本中都可以立即使用。

UCRT(通用C运行时)是一个较新的版本,也是Microsoft Visual Studio默认使用的版本。它应该像使用MSVC编译代码一样工作和表现。

  • 在编译时和运行时更好地与MSVC兼容。
  • 它默认仅适用于Windows 10,对于旧版本,您必须自己提供或依赖用户已安装它。

来源:https://www.msys2.org/docs/environments/


16
这是一个很好的答案,但它并没有解释ucrtvcruntime之间的关系,这也是问题所在。答案是,Microsoft将他们的CRT分成两个部分,一个特定于他们的编译器(vcruntime),另一个对所有编译器都通用(ucrt)。因此,如果您使用非Microsoft编译器(如Clang或GCC),则仍然会使用ucrt,但不使用vcruntimevcruntime仅应由Microsoft的编译器使用。来源:https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170 - Simon Kissane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接