Cerrno在Xcode11.6中无法正常工作,但strerror可以正常工作

问题描述


编辑: Strerror似乎起作用。例如,如果errno = ERANGE,则输出“结果太大”。

问题仍然存在,errno不会从0更改。


在Xcode中,我一直在尝试使用下面的短代码来测试cerrnostrerror。 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。出于存档原因,我在此保留此答案,因为出于此处所述的原因,原始帖子中的代码也很容易看到此结果。