如何解决Cerrno在Xcode11.6中无法正常工作,但strerror可以正常工作
编辑: Strerror似乎起作用。例如,如果errno = ERANGE,则输出“结果太大”。
问题仍然存在,errno不会从0更改。
在Xcode中,我一直在尝试使用下面的短代码来测试cerrno
和strerror
。 Xcode返回
sqrt(-1)= nan
未定义错误:0
代替
sqrt(-1)= -nan
数值论域外,
例如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
时,都应始终对其进行检查,并可能在设置它们的操作后立即将其存储。。如果您在两次检查之间执行其他功能调用,甚至只是像打印到终端这样简单的操作,则可能是在破坏errno
。
errno
成为0
的一个可能原因是由于它包装在流表达式中,并且不能保证iostream不会间接设置(或取消设置){{1 }}的实现。
如果您要检查或打印errno
原因,则始终希望在打印结果之前先进行存储。例如:
errno
编辑:从OP的讨论中,这似乎不是未设置#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;
}
的原因-而是由于math_errhandling
being set to 2
。出于存档原因,我在此保留此答案,因为出于此处所述的原因,原始帖子中的代码也很容易看到此结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。