C/400

127. C言語のエラー箇所を追跡しやすくするには?

C言語でエラーが発生したとき、単純にエラー・メッセージを出力するだけでは
エラーを調査して解決することはできない。

・どのプログラムのどの位置でどのようなエラーが発生したのかを
調べる必要がある。

エンド・ユーザーからエラーであると知らされる情報は
エラー・リストのみであることが多いので
エラー・リストには調査に必要な十分な情報が欲しい。

ここで役に立つのが、特殊変数 : __FUNCTION____LINE__ である。

__FILE__ : には実行したプログラムのソース情報が入る。

[例] R610SRC/QCSRC2 (TESTFUNC)
  ... ソース・ライブラリー/ソース・ファイル (メンバー)

__FUNCTION__ : には実行された関数名が入る。

[例] main

__LINE__ : には実行されたソース・ステートメント番号が入る。

[例] 15

【 TESTFUNC 】

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) のようにして
プログラムのソース情報が入るので、プログラマーは直ちに
エラーのあったプログラムのソースを取り出すことができる。
このようにエラー情報の出力にプログラム情報も出力されるようにしておくと
デバッグが早まることはいうまでもない。