📜  C++中的errno常数

📅  最后修改于: 2021-05-30 02:05:51             🧑  作者: Mango

errno是用于错误指示的预处理器宏。

  • errno的值在程序启动时设置为零,并且无论是否发生错误,标准C++库的任何函数都可以将正整数写入errno。
  • 将errno的值从零更改为非零后,C++标准库中的其他函数都无法将其值更改为零。errnocerrno heder文件中定义。
  • 当数学参数有错误时,errno的值将设置为33。在C++中,数学参数错误由EDOM表示,其值为33。

声明errno()的标头也至少声明了以下宏常量,这些常量的值不为零:

  • EDOM –域错误:一些数学函数仅针对某些实数值定义,称为其域,例如,平方根和对数函数仅针对非负数定义,因此如果我们在这些函数传递负参数,它们将被设置errno到EDOM
  • ERANGE –范围错误:可以用变量表示的值的范围是有限的。例如,诸如pow之类的数学函数很容易超出浮点变量可表示的范围,或者诸如strtod之类的函数可能遇到比该范围可表示的值更长的数字序列。在这些情况下,errno设置为ERANGE。
  • EILSEQ –非法序列:多字节字符序列可能具有一组受限制的有效序列。通过mbrtowc之类的函数翻译一组多字节字符时,遇到无效序列时errno会设置为EILSEQ。

以下是实现errno工作的程序:

程序1:当在日志函数传递负值时,该程序检测错误。

#include 
#include 
#include 
#include 
#include 
using namespace std;
  
int main()
{
    // log function doesn't take negative value
    // thus it changes value of errno to some positive number
    double not_valid = log(-1.0);
  
    // check if value of errno same as value of EDOM i.e. 33
    if (errno == EDOM) {
        cout << " Value of errno is : " << errno << '\n';
        cout << " log(-1) is not valid : "
             << strerror(errno) << '\n';
    }
    return 0;
}
输出:
Value of errno is : 33
 log(-1) is not valid : Numerical argument out of domain

程序2:当在平方根函数传递负值时,该程序检测错误。

#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    // sqrt function doesn't take negative value
    // thus it changes value of errno to some positive number
    double not_valid = sqrt(-100);
  
    // check if value of errno same as value of EDOM i.e. 33
    if (errno == EDOM) {
        cout << " Value of errno is : " << errno << '\n';
        cout << " -100 is not valid argument for square"
             << " root function : " << strerror(errno) << '\n';
    }
    return 0;
}
输出:
Value of errno is : 33
 -100 is not valid argument for square root function : Numerical argument out of domain

程序3:此程序将errno设置为ERANGE。

#include 
using namespace std;
  
// Driver code
int main()
{
    double x;
    double res;
  
    x = 5.000000;
    res = log(x);
  
    if (errno == ERANGE) {
        cout << "Log(" << x << ") is out of range\n";
    }
    else {
        cout << "Log(" << x << ") = " << res << endl;
    }
  
    x = 10.00000;
    res = log(x);
  
    if (errno == ERANGE) {
        cout << "Log(" << x << ") is out of range\n";
    }
    else {
        cout << "Log(" << x << ") = " << res << endl;
    }
  
    x = 0.000000;
    res = log(x);
  
    if (errno == ERANGE) {
        cout << "Log(" << x << ") is out of range\n";
    }
    else {
        cout << "Log(" << x << ") = " << res << endl;
    }
  
    return 0;
}
输出:
Log(5) = 1.60944
Log(10) = 2.30259
Log(0) is out of range
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”