errno

< c‎ | error
定义于头文件 <errno.h>
#define errno /*implementation-defined*/

errno 是一个预处理器宏(见后述),展开成线程局域的 (C11 起) int 类型可修改左值。一些标准库函数通过写入正整数到 errno 指定错误。通常,会将 errno 的值设置为错误码之一。错误码作为以字母 E 后随大写字母或数字开始的宏常量,列于 <errno.h>

errno 的值在程序启动时为 0 ,而且无论是否出现错误,都允许库函数将正整数写入 errno ,不过库函数决不会将 0 存储于 errno

库函数 perrorstrerror 能用于获得对应当前 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
(函数)
返回给定错误码的文本版本
(函数)
定义用于常用数学函数的错误处理机制
(宏常量)