errno
、_doserrno
、_sys_errlist
和 _sys_nerr
在程序执行过程中设置的保存错误代码的全局宏,以及用于显示的错误代码的等效字符串。
语法
#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
值都与可通过使用一个 perror
函数输出的 _sys_errlist
中的错误消息相关联,或者通过使用一个 strerror
或 strerror_s
函数存储在字符串中。 perror
和 strerror
函数使用 _sys_errlist
数组和 _sys_nerr
(_sys_errlist
中的元素数量)处理错误信息。 出于代码安全原因,已弃用对 _sys_errlist
和 _sys_nerr
的直接访问。 我们建议你使用更安全的函数版本,而非全局宏,如下所示:
全局宏 | 功能等效项 |
---|---|
_doserrno |
%> |
errno |
%> |
%> |
库数学例程通过调用 _matherr
设置 errno
。 若要以不同方式处理数学错误,请根据 _matherr
引用说明编写你自己的例程,并将其命名为 _matherr
。
所有 errno
值都是z <errno.h>
中的预定义常量,并且与 UNIX 兼容。 ISO C99 标准中仅指定了 ERANGE
、EILSEQ
和 EDOM
。 有关完整列表,请参阅 errno
常数。
要求
全局宏 | 必需的标头 | 可选标头 |
---|---|---|
errno |
<errno.h> 或 <stdlib.h> ,<cerrno> 或 <cstdlib> (C++) |
|
.- . | <stdlib.h> 、<cstdlib> (C++) |
<errno.h> 、<cerrno> (C++) |
_doserrno
、_sys_errlist
和 _sys_nerr
宏是 Microsoft 扩展。 有关兼容性的详细信息,请参阅 兼容性。
另请参阅
全局变量
errno
常数
%>
_get_doserrno
_set_doserrno
_get_errno
_set_errno