errno
来自 cppreference.com
定义在头文件 <errno.h> 中 |
||
#define errno /*implementation-defined*/ |
||
errno
是一个预处理器宏(但请参阅下面的说明),它展开为 线程局部(自 C11 起) 可修改的左值,其类型为 int。几个标准库函数通过将正整数写入 errno
来指示错误。通常,errno
的值被设置为 <errno.h>
中列出的错误代码之一,这些错误代码以字母 E
开头,后跟大写字母或数字作为宏常量。
errno
的值在程序启动时为 0,并且虽然库函数被允许将正整数写入 errno
,无论是否发生了错误,库函数永远不会将 0 存储在 errno
中。
库函数 perror 和 strerror 可用于获取与当前 errno
值相对应的错误条件的文本描述。
注意:在 C11 之前,C 标准具有相互矛盾的要求,因为它们指出 errno
是一个宏,但也指出“errno
是否是一个宏或一个具有外部链接的标识符是不确定的”。C11 修正了这一点,要求将其定义为一个宏(另请参阅 WG14 N1338)。
[编辑] 示例
运行此代码
#include <stdio.h> #include <math.h> #include <errno.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; 1.0/0.0; show_errno(); errno = 0; acos(+1.1); show_errno(); errno = 0; log(0.0); show_errno(); errno = 0; sin(0.0); show_errno(); }
可能的输出
MATH_ERRNO is set no error occurred domain error occurred pole or range error occurred no error occurred
[编辑] 参考文献
- 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)