此代码在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"
和"English"
。所有这些名称都可以在MSVC中使用,但在MinGW中失败。唯一可以在MinGW中使用的名称是"C"
和"POSIX"
(没有"C.utf8"
或任何其他变体)。
怎么回事?MinGW不是应该使用MSVC运行时吗?我怎样才能让它工作呢?
1条答案
按热度按时间np8igboo1#
GCC和libstdc的MinGW端口仅支持
"C"
和"POSIX"
环境。libstdc中
std::locale::locale
的实现对这两个语言环境名称有特殊处理。所有其他语言环境名称都遵从特定于平台的实现之一,在libstdc源代码中称为“底层语言环境模型”。其中有几种,称为darwin
、ieee_1003.1-2001
、vxworks
、dragonfly
、gnu
、newlib
。最后是generic
。后者是一个仅支持"C"
环境的备用方法。generic
是在Windows上配置GCC时选择的模型,因此std::locale::locale
不调用任何能够创建语言环境的平台函数。这可以通过修复libstdc或MinGW来修复。libstdc可以引入一个新的区域设置模型,直接与MSVCRT
_create_locale
和友元一起工作。另一方面,MinGW可以实现一个shim,在本地Windows区域设置和libstdc支持的模型之一之间进行转换。不幸的是,似乎没有一种方法可以在用户的程序中修复这个问题。