gpt4 book ai didi

c++ - 为什么 std::locale ("").name() 在 clang 和 gcc 上给出不同的结果?

转载 作者:行者123 更新时间:2023-12-01 13:48:05 24 4
gpt4 key购买 nike

在我的机器 (MacOS 10.14.x) 上编译并运行以下代码会导致在 clang++ 上打印空字符串并在 g++ 上引发运行时错误。为什么?

#include <locale>
#include <iostream>


int main()
{
std::cout << "User-preferred locale setting is " <<
std::locale("").name().c_str() << '\n';

return 0;
}
$ clang++ locale.cc
$ ./a.out
User-preferred locale setting is


$ g++-mp-8 locale.cc
$ ./a.out
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
User-preferred locale setting is Abort trap: 6

$ clang++ --version
clang version 7.0.1 (tags/RELEASE_701/final)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /opt/local/libexec/llvm-7.0/bin

$ g++-mp-8 --version
g++-mp-8 (MacPorts gcc8 8.3.0_0) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

目前,我认为这不是 MacOS 问题,因为在 cppreference.com 上运行示例也会产生不同的结果。

您可以在不同的编译器版本中自行尝试: https://en.cppreference.com/w/cpp/locale/locale/name

在任何情况下,它都不会报告与以下内容相同的内容:
#include <locale>
#include <iostream>
#include <string>

int main()
{
std::cout << "User-preferred locale setting is "
<< setlocale(LC_ALL, "") << "\n";

return 0;
}

它为两个编译器返回相同的结果(“en_US.UTF-8”)。

我错过了什么?

最佳答案

差异可能来自于 clang++ 使用 libc++ 的事实。而 g++ 使用 libstdc++ .函数std::locale()在其中任何一个中定义,并且实现不同。

你可以用 strace 来检查这个(如果有),如下:

$ strace -e file ./a.out
...
open("/usr/lib/.../libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3
...

在本例中, libstdc++用来。

关于c++ - 为什么 std::locale ("").name() 在 clang 和 gcc 上给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58245286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com