【发布时间】:2010-12-17 05:35:37
【问题描述】:
我有一个要移植到 MacOSX(特别是 10.6)的 C++ 应用程序。该应用程序大量使用 C++ 标准库和 boost。我最近发现应用中有一些我难以理解的问题。
基本上,boost 文件系统库在程序运行时会抛出运行时异常。通过一些调试和谷歌搜索,我减少了对以下最小程序的违规调用:
#include <locale>
int main ( int argc, char *argv [] ) {
std::locale::global(std::locale(""));
return 0;
}
当我通过 g++ 运行此程序并在设置了LANG=en_US.UTF-8 的环境中执行生成的程序时,该程序失败(在我的计算机上,当我创建一个新的控制台窗口时,它是默认 bash 会话的一部分)。清除环境变量 (setenv LANG=) 允许程序正常运行。但我很惊讶我在默认配置中看到了这种破坏。
我的问题是:
- 此代码在 MacOS 10.6 上是否为预期行为?
- 正确的解决方法是什么?我无法真正重写该函数,因为我们使用的 boost 库版本在内部执行此语句作为文件系统库的一部分。
为了完整起见,我应该指出,合成此代码的程序在通过“打开”命令(或从 Finder)启动时会崩溃,但在 Xcode 在调试模式下运行程序时不会崩溃。
edit以上代码在10.6.1上给出的错误是:
$ ./locale 在抛出 'std::runtime_error' 的实例后调用终止 what(): locale::facet::_S_create_c_locale 名称无效 中止陷阱
【问题讨论】:
-
您能否提供一段简短的代码来展示您看到的损坏情况,而不是无法显示它的通用示例? (这有时被称为测试用例。)它可能就像在您当前的示例中包含一个 boost.filesystem 调用一样简单。
-
当您说“引发运行时异常”时,您到底看到了什么?
-
他发布的代码确实存在问题,至少在我的机器上是这样。我会用我得到的输出来编辑他的问题。
-
是的,我还注意到标准(如
std::)C++ 语言环境支持在 Mac OS X 上似乎完全被破坏了。std::locale("")应该选择默认语言环境,但即使用户的环境设置为与 C 的setlocale一起使用的环境,也无法提供有效的语言环境。不值得回答,但值得评论。 -
如我的回答中所述,这不仅仅是 10.6。在 10.4 上也是如此。