gpt4 book ai didi

c++ - errno 值未更新 (c++)

转载 作者:行者123 更新时间:2023-11-30 03:39:32 25 4
gpt4 key购买 nike

我是编码新手(目前正在学习 C++ 并且我知道一点 C)...

正在阅读 math.h 中的函数和 errno...

根据我提到的网站:-

Domain error (input argument is outside the range in which the operation is mathematically defined, e.g. std::sqrt(-1), std::log(-1), or std::acos(2)). If MATH_ERRNO bit is set, EDOM is assigned to errno. If MATH_ERREXCEPT bit is set, FE_INVALID is raised.

所以我尝试用这些知识编写一个小程序...

#include <iostream>
#include <cerrno>
#include <cmath>
using namespace std;

int main (void)
{
errno = 0;
cout<<"\nWhat I get :-\n";
cout << "log(-3) = " << log(-3) << "\n";
//shouldn't it do (errno = EDOM) in the above step?
cout << "errno = " << errno << "\n";
cout << strerror(errno) << "\n";

errno = EDOM;
cout<<"\nWhat I want :-\n";
cout << "log(-3) = " << log(-3) << "\n";
cout << "errno = " << errno << "\n";
cout << strerror(errno) << "\n\n";

return(0);
}

在输出中我看到 errno 没有更新到我的第一个 block 中的 EDOM 即使 -3 不在 log() 的域中......

输出:-

What I get :-
log(-3) = nan
errno = 0
Undefined error: 0

What I want :-
log(-3) = nan
errno = 33
Numerical argument out of domain

我不明白我在这里错过了什么......请帮忙....

我正在 Mac 中的 Apple LLVM 版本 7.3.0 (clang-703.0.31) 上编译我的代码。

最佳答案

#define MATH_ERRNO 1 是非法的。您不应该重新定义标准库符号。 MATH_ERRNO 已按标准定义为 1。

您无法设置实现处理错误的方式(除了特定于编译器的开关。阅读编译器的文档)。你只能检查它:

if (math_errhandling & MATH_ERRNO)
std::cout << "Error reporting uses errno\n";
else
std::cout << "Error reporting does not use errno\n";

if (math_errhandling & MATH_ERREXCEPT)
std::cout << "Error reporting uses floating-point exceptions\n";
else
std::cout << "Error reporting does not use floating-point exceptions\n";

对于 clang,相关标志是 -fmath-errno/-fmath-no-errno 使用/不使用 errno

来自 discussion on reported bug看起来,标准库的 Mac 实现根本不使用 errno。所以如果你想用它来报告错误,你就不走运了。

关于c++ - errno 值未更新 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815446/

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