サイトマップ / C言語講座>出入り口>総目次>目次:バグ対策>エラーメッセージ
[NDEBUGマクロとassert( )]←このソース→[悪質なバグの例]
/* errno はエラーを示すグローバル変数です。プログラム起動時に、0に初期化されます。標準ライブラリ関数のあるものは、エラーを検出すると、エラーの種類に応じて、error.h に定義されているエラー番号をerrno にセットします。
エラーを検出するには、既に呼ばれた他の関数によって、エラー番号がセットされている可能性があるので、関数を呼び出す直前に errno を0に再初期化して置き、関数を呼び出した直後に errno の値を調べます。
今回は、平方根を返すライブラリ関数を例にして、エラーの検出について学びます。平方根を返すライブラリ関数を下記に示します。
#include <math.h> double sqrt(double x); 例:y = sqrt(x);
sqrt( ) は、double 型の浮動小数点数 x の平方根を返します。もし、x が負ならば0を返し、同時に errno に EDOM をセットします。EDOM とは、ドメインエラーのことで、関数に渡した値が不正(ここでは、負の値)の時セットされます。
下記に示すライブラリ関数 strerror( ) は、セットされたエラー番号に対応するエラーメッセージ文字列へのポインタを返します。
#include <string.h> char *strerror(int n); 例:emsg = strerror(n);
strerror( ) は、下記のように使います。
char *emsg = "Invalid Argument for sqrt( )"; fprintf(stderr, "%s: %s\n", emsg, strerror(errno));
標準ライブラリ関数には、直接、エラーメッセージを標準エラー出力に出力する関数 perror( ) も用意されています。下記に示します。
#include <stdio.h> void perror(const char *s); 例:perror(s);
例に示した使い方は次のコードと同等です。
fprintf(stderr, "%s: %s\n", s, strerror(errno));
perror( ) は、文字列 s とともに errno に対応するエラーメッセージを、標準エラー出力 ( stderr ) に出力します。
標準エラー出力はプログラム起動時に、標準入力 ( キーボード ) 、標準出力 ( コンソール ) 、とともに開かれるストリーム ( 読み込み書き込みをする対象、即ち、ファイル ) です。標準エラー出力も標準出力もともにコンソールに出力しますが、標準エラー出力はバッファリングをしません。プログラムに何か異常が起きた時は、より確実に表示される標準エラー出力にメッセージを書き込みます。
今回は、-1.0 を引数に sqrt( ) を呼び出して、わざとエラーを起こし、perror( ) でエラーの内容を表示します。 */
#include <stdio.h> #include <math.h> /* sqrt( ) に必要 */ #include <errno.h> /* errno を使うために必要 */ void main(void); void main(void) { errno = 0; /* グローバル変数 errno を0に初期化 */ /* -1の平方根を求めようとした */ printf("sqrt( -1.0 ) : %lf\n", sqrt(-1.0)); if (errno) /* errno が0でなければ */ perror("Invalid Argument for sqrt( )"); } |
/* 他のエラーについては errno.h を見て下さい。 */
[NDEBUGマクロとassert( )]←このソース→[悪質なバグの例]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−