在OS X上设置区域会导致崩溃问题

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的一个bug吗?

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


我认为这几乎是这个问题的一个副本... - Eitan T
@EitanT 很好的发现,这是(一个精确的重复项)!谢谢。 - Konrad Rudolph
我认为你没有使用xlocale。我相信你的问题与libstdc++有关,它使用不同的区域设置支持库(显然在OS X上不受支持,正如EitanT链接到的问题所述)。我认为如果你切换到libc++,你的程序将会工作。尽管如我问题中所述,由于xlocale中的错误,某些区域设置在libc++中存在问题。 - bames53
@bames53 太棒了,能把这个写成一个答案吗?这样我就可以点赞并接受了。你说得对,这确实带来了自己的问题(打印时区名称为空),但至少现在在某些输入上使用时似乎已经采用了UTF-8编码。 - Konrad Rudolph
2个回答

2
我认为您没有使用xlocale。我相信您的问题与libstdc++有关,它使用不受OS X支持的不同区域设置支持库,正如EitanT链接到的问题所述。
如果您切换到libc ++,您的程序将可以工作。

0
上面的海报是正确的...问题出在libstdc++上。我想添加我的答案,因为如何让OS X链接libc++并不直观,我花了一个多小时才弄清楚。
通过g++ -libstd=libc++clang++ -libstd=libc++或别名c++ -libstd=libc++调用编译器/链接器都会失败。
在命令行上编译简单程序的解决方案,而不是搞乱Xcode的额外开销,是使用命令xcrun clang++ -stdlib=libc++允许Xcode处理链接。 xcrun允许Xcode管理工具链,并将构建成功的可执行文件,其中cout.imbue(locale(foo))将成功工作。

3
实际上,在以下操作中,你可以很好地使用libc++和clang++export CXX="clang++-$cxxver -stdlib=libc++"export CXXFLAGS="-nostdinc++ -isystem /usr/local/lib/llvm-$cxxver/include/c++/v1"(适用于适当的$cxxver)。我不建议在任何过程的任何部分依赖Xcode-特别是在使用Homebrew安装较新版本的Clang之后。 - Konrad Rudolph
Konrad,非常感谢您的帮助,但您能否再帮助一下新手并解释一下这些命令的作用? - user3176017
2
export 命令可以在终端中设置环境变量。熟悉 CXXCXXFLAGS 变量,它们对于在 Unix 上开发 C++ 程序相当重要。现在,使用这些变量设置的选项包括 -nostdinc++,它禁用了默认标准库实现的使用。-libc++ 告诉 clang 使用 libc++ 而不是默认的 libstdc++,而 -system … 则告诉 clang 在哪里找到它。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接