在程序执行过程中设置的保存错误代码的全局宏,以及用于显示的错误代码的等效字符串。
语法
#define errno (*_errno())
#define _doserrno (*__doserrno())
#define _sys_errlist (__sys_errlist())
#define _sys_nerr (*__sys_nerr())
备注
程序启动期间,errno 和 _doserrno 均由运行时设置为 0。
errno 是在系统级调用中发生错误时设置的。 由于 errno 保留设置它的上一次调用的值,因此该值可能会被后续的调用更改。 发生错误时设置 errno 的运行库调用不会在成功后清除 errno。 始终在调用可能设置 errno 前,通过调用 _set_errno(0) 立即清除它,并在调用后立即进行检查。
发生错误时,errno 不必设置为与系统调用返回的错误代码相同的值。 对于 I/O 操作,_doserrno 将存储与 errno 代码等效的操作系统错误代码。 对于大多数非 I/O 操作,未设置 _doserrno 的值。
每个 errno 值都与可通过使用一个 _sys_errlist 函数输出的 perror 中的错误消息相关联,或者通过使用一个 strerror 或 strerror_s 函数存储在字符串中。
perror 和 strerror 函数使用 _sys_errlist 数组和 _sys_nerr(_sys_errlist 中的元素数量)处理错误信息。 出于代码安全原因,已弃用对 _sys_errlist 和 _sys_nerr 的直接访问。 我们建议你使用更安全的函数版本,而非全局宏,如下所示:
| 全局宏 | 功能等效项 |
|---|---|
_doserrno |
_get_doserrno、_set_doserrno |
errno |
_get_errno、_set_errno |
_sys_errlist、_sys_nerr |
strerror_s、_strerror_s、_wcserror_s、__wcserror_s |
库数学例程通过调用 errno 设置 _matherr。 若要以不同方式处理数学错误,请根据 _matherr 引用说明编写你自己的例程,并将其命名为 _matherr。
所有 errno 值都是z <errno.h> 中的预定义常量,并且与 UNIX 兼容。 ISO C99 标准中仅指定了 ERANGE、EILSEQ 和 EDOM。 有关完整列表,请参阅 errno 常数。
要求
| 全局宏 | 必需的标头 | 可选标头 |
|---|---|---|
errno |
<errno.h> 或 <stdlib.h>,<cerrno> 或 <cstdlib> (C++) |
|
_doserrno、 _sys_errlist、 _sys_nerr |
<stdlib.h>、<cstdlib> (C++) |
<errno.h>、<cerrno> (C++) |
_doserrno、_sys_errlist、 和 _sys_nerr 宏是 Microsoft 扩展。 有关兼容性的详细信息,请参阅 兼容性。
另请参阅
全局变量
errno 常数
perror, _wperror
strerror、_strerror、_wcserror、__wcserror
strerror_s、_strerror_s、_wcserror_s、__wcserror_s
_get_doserrno
_set_doserrno
_get_errno
_set_errno