C 标准库的 errno.h 头文件它主要是定义了errno整数变量,errno.h 头文件里面是通过系统来调用设置,就如在错误事件中的某些库函数表明了什么发生了错误。该宏扩展为类型为 int 的可更改的左值,因此它可以被一个程序读取和修改。
对于errno的值设置刚开始是为0,也可以在适当的时候修改它的值或重置。errno.h 头文件也顶了以一系列表示不同错误代码的宏,这些宏应扩展为类型为 int 的整数常量表达式。
接下来就看看errno.h头文件中定义的宏有哪些:
extern int errno
这是通过系统调用设置的宏,在错误事件中的某些库函数表明了什么发生了错误。
(1)这个宏的声明为:
extern int errno
(2)NA既是他的参数,也是返回值。我们用实例来深入了解他的用法。
(3)例子:
#include #include #include
extern int errno ;
int main (){
FILE *fp;
fp = fopen("file.txt", "r");
if( fp == NULL )
{
fprintf(stderr, "Value of errno: %d\n", errno);
fprintf(stderr, "Error opening file: %s\n", strerror(errno));
}
else
{
fclose(fp);
}
return(0);
}
结果:
Value of errno: 2Error opening file: No such file or directory
EDOM Domain Error
这个宏表示一个域错误,它在输入参数超出数学函数定义的域时发生,errno 被设置为 EDOM
(1)下面是 EDOM 宏的声明。
#define EDOM some_value
(2)参数和返回值跟前面说的那个是一样的
(3)用法的例子:
#include
#include
#include
int main(){
double val;
errno = 0;
val = sqrt(-10);
if(errno == EDOM)
{
printf("Invalid value \n");
}
else
{
printf("Valid value\n");
}
errno = 0;
val = sqrt(10);
if(errno == EDOM)
{
printf("Invalid value\n");
}
else
{
printf("Valid value\n");
}
return(0);
}
结果:
Invalid valueValid value
ERANGE Range Error
这个宏表示一个范围错误,它在输入参数超出数学函数定义的范围时发生,errno 被设置为 ERANGE。
(1)声明
#define ERANGE some_value
下面的实例演示了 ERANGE 宏的用法。
实例
#include
#include
#include
int main()
{
double x;
double value;
x = 2.000000;
value = log(x);
if( errno == ERANGE )
{
printf("Log(%f) is out of range\n", x);
} else {
printf("Log(%f) = %f\n", x, value);
}
x = 1.000000;
value = log(x);
if( errno == ERANGE )
{
printf("Log(%f) is out of range\n", x);
} else {
printf("Log(%f) = %f\n", x, value);
}
x = 0.000000;
value = log(x);
if( errno == ERANGE )
{
printf("Log(%f) is out of range\n", x);
} else {
printf("Log(%f) = %f\n", x, value);
}
return 0;
}
让我们编译并运行上面的程序,这将产生以下结果:
Log(2.000000) = 0.693147Log(1.000000) = 0.000000Log(0.000000) = -inf