在OS X上设置区域设置崩溃

时间:2012-06-25 13:12:35

标签: c++ macos locale xlocale

以下代码在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"""以及任何实现定义的值。

因此,导致上述行为的任何原因都违反了标准。

使用的编译器是clang ++ 3.1(tags / Apple / clang-318.0.58);我也尝试过通过Homebrew安装的GCC 4.7,结果相同。

其他人可以验证此问题吗?是什么导致的?我做错了吗?这是OS X中的错误吗?

(也许这是relates to another xlocale problem,但错误实际上完全不同。)

2 个答案:

答案 0 :(得分:2)

我认为你没有使用xlocale。我相信您的问题在于libstdc ++,它使用OS X不支持的不同语言环境支持库,因为EitanT链接到州。

如果切换到libc ++,你的程序就可以运行。

答案 1 :(得分:0)

上面的海报正确...问题在于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))将成功运行。