errno
|
定义于头文件
<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 <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> (页: TBD)
-
- K.3.1.3 errno 的使用 (页: TBD)
-
- K.3.2 错误 <errno.h> (页: TBD)
- C17 标准 (ISO/IEC 9899:2018):
-
- 7.5 错误 <errno.h> (页: TBD)
-
- K.3.1.3 errno 的使用 (页: TBD)
-
- K.3.2 错误 <errno.h> (页: TBD)
- C11 标准 (ISO/IEC 9899:2011):
-
- 7.5 错误 <errno.h> (页: 205)
-
- K.3.1.3 errno 的使用 (页: 584)
-
- K.3.2 错误 <errno.h> (页: 585)
- C99标准(ISO/IEC 9899:1999):
-
- 7.5 错误处理 <errno.h> (页码: 186)
- C89/C90 标准 (ISO/IEC 9899:1990):
-
- 4.1.3 错误处理 <errno.h>
参见
|
标准POSIX兼容错误条件的宏定义
(宏常量) |
|
|
向
stderr
输出当前错误对应的字符串描述
(函数) |
|
|
(C11)
(C11)
|
返回给定错误码的文本描述
(函数) |
|
(C99)
(C99)
(C99)
|
定义通用数学函数使用的错误处理机制
(宏常量) |
|
C++ documentation
for
errno
|
|