C言語でエラーが発生したとき、単純にエラー・メッセージを出力するだけでは
エラーを調査して解決することはできない。
・どのプログラムのどの位置でどのようなエラーが発生したのかを
調べる必要がある。
エンド・ユーザーからエラーであると知らされる情報は
エラー・リストのみであることが多いので
エラー・リストには調査に必要な十分な情報が欲しい。
ここで役に立つのが、特殊変数 : __FUNCTION__
と __LINE__
である。
[例] R610SRC/QCSRC2 (TESTFUNC)
... ソース・ライブラリー/ソース・ファイル (メンバー)
[例] main
__LINE__ : には実行されたソース・ステートメント番号が入る。[例] 15
0001.00 #include <stdio.h> 0002.00 #include <stdlib.h> 0003.00 #include <string.h> 0004.00 0005.00 #define TRUE 0 0006.00 #define FALSE -1 0007.00 0008.00 void main(void){ 0009.00 0010.00 printf("** TESTFUNC : 関数名の出力 **n"); 0011.00 getchar(); 0012.00 0013.00 printf("%s %s:%d でエラーがあった。 n", __FILE__, __FUNCTION__, __LINE__); 0014.00 getchar(); 0015.00 }
__LINE__ はエラーを出力した printf 文の行番号 : 13 が入るので
エラーが発生したソース上のステートメント番号を直ちに知ることができる。
__FUNCTION__ は、この __FUNCTION__ が示された関数名が入るので
別の変数 : _FUNC_ などを定義しておいて、関数の先頭に
sprintf(_FUNC_, "%s", __FUNCTION__);
のようにして関数名を保存しておいてエラーがあれば
この _FUNC_ を出力するようにしておけば
どの関数でエラーになったかを知ることができる。
__FILE__ には R610SRC/QCSRC2 (TESTFUNC) のようにして
プログラムのソース情報が入るので、プログラマーは直ちに
エラーのあったプログラムのソースを取り出すことができる。
このようにエラー情報の出力にプログラム情報も出力されるようにしておくと
デバッグが早まることはいうまでもない。