在OS X崩溃设置地区(Setting locales on OS X crashes)

2019-06-25 18:29发布

下面的代码工作正常,在Linux上,但抛出的OS X 10.7例外:

#include <iostream>
#include <locale>
#include <stdexcept>

int main() try {
    std::locale::global(std::locale(""));
    std::cout << "Using locale: " << std::locale().name() << "\n";
}
catch (std::runtime_error const& e) {
    std::cout << e.what() << "\n";
    return 1;
}

在OS X上的输出是:

locale::facet::_S_create_c_locale名无效

然而,该标准明确地说,

该组有效的字符串参数值是"C""" ,和任何实现定义的值。

所以,无论导致上述​​行为违反了标准。

所使用的编译器铛++ 3.1(标签/苹果/铛-318.0.58); 我也用GCC 4.7试了一下,通过自制安装,具有相同的结果。

其他人可以验证这个问题? 是什么原因导致的呢? 难道我做错了什么? 这是在OS X中的错误?

(也许这涉及到另一个xlocale问题 ,但这些错误实际上是完全不同的。)

Answer 1:

我不认为你正在使用xlocale。 我相信,你的问题是用的libstdc ++,它使用的是不支持OS X不同的语言环境支持库,因为这个问题EitanT链接状态。

如果切换到libc ++程序会工作。



Answer 2:

它上面的海报正确的...问题是用的libstdc ++。 我想补充我的回答,因为它不是简单的如何获得OS X反对的libc链接++和我花了一个多小时才能弄清楚。

通过调用编译器/链接g++ -libstd=libc++或通过clang++ -libstd=libc++或通过别名c++ -libstd=libc++都将失败。

用于从所述命令行而不是在Xcode的开销的增加搞乱编译简单方案解决方案是允许通过使用命令的Xcode来处理所述连接xcrun clang++ -stdlib=libc++

xcrun允许Xcode的管理工具链,并建立一个成功的可执行文件,其中cout.imbue(locale(foo))将成功运行。



文章来源: Setting locales on OS X crashes