errno
来自cppreference.com
| 在标头 <errno.h> 定义
|
||
| |
||
errno 是一个预处理器宏(见后述),展开成线程局域的(C11 起) int 类型可修改左值。一些标准库函数通过写入正整数到 errno 指定错误。通常,会将 errno 的值设置为错误码之一。错误码作为以字母 E 后随大写字母或数字开始的宏常量,列于 <errno.h>。
errno 的值在程序启动时为 0 ,而且无论是否出现错误,都允许库函数将正整数写入 errno ,不过库函数决不会将 0 存储于 errno。
库函数 perror 和 strerror 能用于获得对应当前 errno 值的错误条件的文本描述。
注解: C11 前,C 标准有矛盾的要求,称 errno 是宏但亦称“不指明 errno 是宏还是声明带外部链接的标识符”。C11 修正了此错误,要求必须定义它为宏(参阅 WG14 N1338)。
示例
运行此代码
#include <errno.h>
#include <math.h>
#include <stdio.h>
void show_errno(void)
{
const char *err_info = "未知错误";
switch (errno)
{
case EDOM:
err_info = "定义域错误";
break;
case EILSEQ:
err_info = "非法序列";
break;
case ERANGE:
err_info = "极点或值域错误";
break;
case 0:
err_info = "无错误";
}
fputs(err_info, stdout);
puts("发生");
}
int main(void)
{
fputs("MATH_ERRNO ", stdout);
puts(math_errhandling & MATH_ERRNO ? "已设置" : "未设置");
errno = 0;
(void)(1.0 / 0.0);
show_errno();
errno = 0;
(void)acos(+1.1);
show_errno();
errno = 0;
(void)log(0.0);
show_errno();
errno = 0;
(void)sin(0.0);
show_errno();
}
可能的输出:
MATH_ERRNO 已设置
发生无错误
发生定义域错误
发生极点或值域错误
发生无错误
引用
- C23 标准(ISO/IEC 9899:2024):
- 7.5 Errors <errno.h> (第 TBD 页)
- K.3.1.3 Use of errno (第 TBD 页)
- K.3.2 Errors <errno.h> (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 7.5 Errors <errno.h> (第 TBD 页)
- K.3.1.3 Use of errno (第 TBD 页)
- K.3.2 Errors <errno.h> (第 TBD 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.5 Errors <errno.h> (第 205 页)
- K.3.1.3 Use of errno (第 584 页)
- K.3.2 Errors <errno.h> (第 585 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.5 Errors <errno.h> (第 186 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.1.3 Errors <errno.h>
参阅
| 标准 POSIX 兼容的错误条件宏 (宏常量) | |
| 显示对应当前错误的字符串到 stderr (函数) | |
(C11)(C11) |
返回给定错误码的文本版本 (函数) |
(C99)(C99)(C99) |
定义用于常用数学函数的错误处理机制 (宏常量) |
errno 的 C++ 文档
| |