gpt4 book ai didi

c++ - Cerrno在Xcode(11.6)中不起作用,但strerror起作用

转载 作者:行者123 更新时间:2023-12-02 09:59:23 24 4
gpt4 key购买 nike

编辑: Strerror似乎起作用。例如,如果errno = ERANGE,则输出“结果太大”。
问题仍然是errno不会从0更改。

在Xcode中,我一直在尝试使用下面的短代码来尝试cerrnostrerror。 Xcode返回

sqrt(-1) = nan

Undefined error: 0


代替

sqrt(-1) = -nan

Numerical argument out of domain,


例如cpp.sh。
为什么会这样呢?
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cerrno>
#include <cstring>

using namespace std;

int main() {

errno = 0;
cout << "sqrt(-1) = " << sqrt(-1) << endl;
cout << strerror(errno) << endl << endl;

return(0);
}

最佳答案

每当在操作后想要检查errno时,都应始终在对其进行设置的操作之后立即对其进行检查,并可能将其存储。如果您在两次检查之间执行其他函数调用,甚至只是像打印到终端一样简单,那么您可能正在破坏errnoerrno成为0的一个可能原因是由于它包装在流表达式中,并且不能保证iostream不会通过其实现间接设置(或取消设置)errno
如果您要检查或打印errno原因,则始终希望在打印结果之前先进行存储。例如:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cerrno>
#include <cstring>

int main() {

errno = 0;

// store errno immediately after the computation
const auto result = std::sqrt(-1);
const auto err = errno;

// then print
std::cout << "sqrt(-1) = " << result << std::endl;
std::cout << std::strerror(err) << std::endl << std::endl;

return 0;
}

编辑:从OP注释中的讨论来看,这似乎不是 errno未设置的原因-而是由于 math_errhandling being set to 2 。我出于文件原因在此保留此答案,因为由于此处所述的原因,原始帖子中的代码也很容易看到此结果。

关于c++ - Cerrno在Xcode(11.6)中不起作用,但strerror起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63458713/

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