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
コメント