c++ std::locale构造函数在使用MinGW编译的程序中引发异常

j2cgzkjk  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(298)

此代码在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运行时吗?我怎样才能让它工作呢?

np8igboo

np8igboo1#

GCC和libstdc的MinGW端口仅支持"C""POSIX"环境。
libstdc
std::locale::locale的实现对这两个语言环境名称有特殊处理。所有其他语言环境名称都遵从特定于平台的实现之一,在libstdc源代码中称为“底层语言环境模型”。其中有几种,称为darwinieee_1003.1-2001vxworksdragonflygnunewlib。最后是generic。后者是一个仅支持"C"环境的备用方法。
generic是在Windows上配置GCC时选择的模型,因此std::locale::locale不调用任何能够创建语言环境的平台函数。
这可以通过修复libstdc
或MinGW来修复。libstdc可以引入一个新的区域设置模型,直接与MSVCRT _create_locale和友元一起工作。另一方面,MinGW可以实现一个shim,在本地Windows区域设置和libstdc支持的模型之一之间进行转换。
不幸的是,似乎没有一种方法可以在用户的程序中修复这个问题。

相关问题