Namespaces
Variants

errno

From cppreference.net
< c ‎ | error
ヘッダーで定義 <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> (p: TBD)
  • K.3.1.3 errnoの使用 (p: TBD)
  • K.3.2 エラー <errno.h> (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 7.5 Errors <errno.h> (p: TBD)
  • K.3.1.3 Use of errno (p: TBD)
  • K.3.2 Errors <errno.h> (p: TBD)
  • C11規格 (ISO/IEC 9899:2011):
  • 7.5 エラー <errno.h> (p: 205)
  • K.3.1.3 errnoの使用 (p: 584)
  • K.3.2 エラー <errno.h> (p: 585)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.5 エラー <errno.h> (p: 186)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 4.1.3 エラー <errno.h>

関連項目

標準的なPOSIX互換のエラー条件のためのマクロ
(マクロ定数)
現在のエラーに対応する文字列を stderr に表示する
(関数)
指定されたエラーコードのテキスト版を返す
(関数)
一般的な数学関数で使用されるエラー処理メカニズムを定義する
(マクロ定数)