8

以下代码在 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 中的错误吗?

(也许这与另一个xlocale问题有关,但错误实际上完全不同。)

4

2 回答 2

2

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

如果你切换到 libc++,你的程序就可以工作了。

于 2012-06-25T15:13:18.497 回答
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))

于 2014-03-11T04:54:27.660 回答