errno
定义于头文件 <errno.h>
|
||
#define errno /*implementation-defined*/ |
||
errno
是一个预处理器宏(见后述),展开成线程局域的 (C11 起) int 类型可修改左值。一些标准库函数通过写入正整数到 errno
指定错误。通常,会将 errno
的值设置为错误码之一。错误码作为以字母 E
后随大写字母或数字开始的宏常量,列于 <errno.h>
。
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 standard (ISO/IEC 9899:2011):
- 7.5 Errors <errno.h> (p: 205)
- K.3.1.3 Use of errno (p: 584)
- K.3.2 Errors <errno.h> (p: 585)
- C99 standard (ISO/IEC 9899:1999):
- 7.5 Errors <errno.h> (p: 186)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.1.3 Errors <errno.h>
参阅
标准 POSIX 兼容的错误条件宏 (宏常量) | |
显示对应当前错误的字符串到 stderr (函数) | |
(C11)(C11) |
返回给定错误码的文本版本 (函数) |
(C99)(C99)(C99) |
定义用于常用数学函数的错误处理机制 (宏常量) |