[C言語 標準ライブラリ] errno.hの使い方

※本ブログでは、商品・サービスのリンク先にプロモーションを含みます。

スポンサーリンク

errno.hには、システムコールや標準ライブラリで発生したエラーの状態を表すerrno、およびエラー値を表す定数マクロが定義されています。
関数は定義されていません。

スポンサーリンク

マクロ

EDOM

引数が領域外であること(ドメインエラー、定義域エラー)を示します。
上記エラーが発生した場合、errnoにEDOMが設定されます。

使用例:

#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <string.h>

int main(void)
{
    double x = -1.0; // sqrtの定義域外の値

    errno = 0; // errnoをリセット
    double value = sqrt(x);

    if(errno == EDOM){
        printf("エラー: %s\n", strerror(errno));
    }else{
        printf("平方根の値: %f\n", value);
    }

    return 0;
}

このプログラムでは、sqrt関数に-1.0(sqrtの定義域外)を引数として与えています。
このため、errnoにEDOMが設定されます。

実行結果:

エラー: Domain error

ERANGE

結果が大きすぎること(値域エラー)を示します。
上記エラーが発生した場合、errnoにERANGEが設定されます。

使用例:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(void)
{
    char *end;
    const char *str = "1.7e309"; // doubleの最大値より大きい値

    double value = strtod(str, &end);

    if(errno == ERANGE){
        printf("変換エラー: %s\n", strerror(errno));
    }else{
        printf("変換した値: %f\n", value);
    }

    return 0;
}

このプログラムでは、”1.7e309″という文字列(double型の最大値より大きい)をstrtod関数でdouble型に変換しようとしています。
この値は大きすぎるため、ERANGEがerrnoに設定されます。

実行結果:

変換エラー: Result too large

変数(マクロ)

errno

errnoは、システムコールや標準ライブラリでエラーが発生した場合に、エラーの原因を示す定数マクロが設定されます。
システムコールや標準ライブラリによって0に再設定されることはありません。

実装環境によってerrnoは変数の場合やマクロの場合があります。
昔は変数で実装、今はマクロで実装されることが多いようです。

使用例:

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main(void)
{
    FILE *fp;

    // ファイルを開こうとしますが、そのファイルは存在しません。
    fp = fopen("nonexistentfile.txt", "r");

    // fopenが失敗した場合、errnoにはエラーコードが設定されます。
    if(fp == NULL){
        printf("エラー: %s\n", strerror(errno));
    }

    return 0;
}

このプログラムでは、存在しないファイルを開こうとしています。
ファイルが存在しないため、fopen関数はNULLを返します。
これにより、errnoにはエラーコードが設定されます。
strerror関数は、errnoの値を人間が読めるエラーメッセージに変換します。

実行結果:

エラー: No such file or directory
スポンサーリンク
C言語

コメント