此代码在 MSVC (2022) 中运行,并在 MinGW (x86_64-w64-mingw32 gcc-12.2.0) 中引发运行时错误:
#include <locale>
int main()
{
std::locale l("en_US.utf8");
}
错误是
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
我尝试过许多不同的区域设置名称,包括""
, "en_US"
, and "English"
。它们都适用于 MSVC,但适用于 MinGW 则失败。唯一在 MinGW 中工作的是"C"
and "POSIX"
(no "C.utf8"
或任何其他变体)。
是什么赋予了? MinGW 不是应该使用 MSVC 运行时吗?我怎样才能让它发挥作用?
Only "C"
and "POSIX"
GCC 和 libstdc++ 的 MinGW 端口支持语言环境。
实施std::locale::locale
libstdc++ 对这两个语言环境名称进行了特殊处理。所有其他的都遵循特定于平台的实现之一,在 libstdc++ 源代码中称为“底层语言环境模型”。其中有几个,称为darwin
, ieee_1003.1-2001
, vxworks
, dragonfly
, gnu
, newlib
, 最后generic
后者是一个后备,仅支持"C"
locale.
generic
是在Windows上配置GCC时选择的模型。因此,std::locale::locale
不调用任何能够创建语言环境的平台函数。
可以通过修复 libstdc++ 或 MinGW 来修复此问题。 libstdc++ 可以引入直接与 MSVCRT 配合使用的新语言环境模型_create_locale
和朋友。另一方面,MinGW 可以实现一个 shim,可以在本机 Windows 语言环境和 libstdc++ 支持的模型之一之间进行转换。
不幸的是,似乎没有办法在用户程序中解决这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)