C400

73. プログラム名の出力

ある日、エラー・メッセージが印刷出力されているのだが、どのプログラムからの

エラー出力であるのかどうかがわからない。

どのプログラムからの出力であるかを調査するのには時間がかかってしまう。

RPG では印刷出力や画面表示にプログラム名を表示しているのはこのためである。

しかし C言語ではいちいちエラー・メッセージにプログラム名まで丁寧に

出力するような几帳面なプログラマーは稀れである。

何とか汎用的にプログラム名を出力する方法はないだろうか ? と調べてみた。

コンパイルの事前定義マクロでの __FILE__ を出力する方法がある。

printf("%s\n", __FILE__);

を実行すると

R610SRC/QCSRC(TESTSRC)

のようにソース・ファイル名が出力されることがわかった。

さらに事前定義マクロは簡単な式も使えるようであり、

printf("%s\n", &__FILE__[13]);

と変更して実行してみると

(TESTSRC)

としてソース・メンバーだけを取り出すことができることがわかった。

これを利用したのが次のサンプル・ソースである。

【 ソース・メンバー名を取り出すサンプル:TESTSRC 】
----------------------------------------------------------------------------
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 #define __PGM__  &__FILE__[13]                                      
0008.00                                                                     
0009.00 void main(void){                                                    
0010.00    char source[48], srcmbr[10];                                     
0011.00                                                                     
0012.00    printf("**** TESTSRC ***\n");                                    
0013.00    getchar();                                                       
0014.00    printf("__FILE__ = %s\n", __FILE__);                             
0015.00    printf("PGM      = %s\n", __PGM__);                              
0016.00    printf("%s ステートメント %d でエラーが発生しました。 \n",       
0017.00        __PGM__, __LINE__);                                          
0018.00    getchar();                                                       
0019.00    exit(0);                                                         
0020.00                                                                     
0021.00 }                                                                   
----------------------------------------------------------------------------
【 実行結果 】