errno
来自 cppreference.cn
定义于头文件 <errno.h> |
||
#define errno /* implementation-defined */ |
||
errno
是一个预处理器宏(但请参阅下面的注释),它扩展为一个 线程局部(C11 起)的可修改的 int 类型左值。几个标准库函数通过向 errno
写入正整数来指示错误。通常,errno
的值被设置为 <errno.h> 中列出的错误代码之一,这些错误代码是宏常量,以字母 E
后跟大写字母或数字开头。
程序启动时 errno
的值为 0,尽管库函数可以在发生错误或未发生错误时向 errno
写入正整数,但库函数绝不会在 errno
中存储 0。
库函数 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 = "unknown error"; switch (errno) { case EDOM: err_info = "domain error"; break; case EILSEQ: err_info = "illegal sequence"; break; case ERANGE: err_info = "pole or range error"; break; case 0: err_info = "no error"; } fputs(err_info, stdout); puts(" occurred"); } int main(void) { fputs("MATH_ERRNO is ", stdout); puts(math_errhandling & MATH_ERRNO ? "set" : "not set"); 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 is set no error occurred domain error occurred pole or range error occurred no error occurred
[编辑] 参考
- C23 标准 (ISO/IEC 9899:2024)
- 7.5 错误 <errno.h> (p: 待定)
- K.3.1.3 errno 的使用 (p: 待定)
- K.3.2 错误 <errno.h> (p: 待定)
- C17 标准 (ISO/IEC 9899:2018)
- 7.5 错误 <errno.h> (p: 待定)
- K.3.1.3 errno 的使用 (p: 待定)
- K.3.2 错误 <errno.h> (p: 待定)
- C11 标准 (ISO/IEC 9899:2011)
- 7.5 错误 <errno.h> (p: 205)
- K.3.1.3 errno 的使用 (p: 584)
- K.3.2 错误 <errno.h> (p: 585)
- C99 标准 (ISO/IEC 9899:1999)
- 7.5 错误 <errno.h> (p: 186)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.1.3 错误 <errno.h>
[编辑] 另请参阅
标准 POSIX 兼容错误条件的宏 (宏常量) | |
向 stderr 显示与当前错误对应的字符串 (函数) | |
(C11)(C11) |
返回给定错误代码的文本版本 (函数) |
(C99)(C99)(C99) |
定义常用数学函数使用的错误处理机制 (宏常量) |
C++ 文档 关于 errno
|