Windows XP
VC++ V6.0
現在Windowsアプリの開発をしております。
プログラムの仕様でlogファイルを出力することになっているのですが
モジュール実行時に呼ばれた関数の戻り値(TRUEやFALSE等)を
そのlogファイルに書き込む処理をしております。
そこでお聞きしたいのですが、
それぞれ実行した際に呼び出した関数もlogファイルに
書込みたいのですが、呼び出した関数もわかるマクロの
様なものはあるのでしょうか?
log関数というのがあるようですが、これは違うようでした。
何かアドバイス頂けると有難いです。
宜しくお願い致します。
回答ではありません
関数名の取得レベルはどこまで必要なのでしょうか
たとえば 「printf」の中身まで
それとも、自作関数名までで良い
後者でよければ、関数ごとにログ出力関数記述すればよいこと
だと思います
前者であれば、俺はわかりません
昔、こんなマクロを作ったことがあります。
#define DECLARE_FUNCTION( rettype, funcname, arglist ) \
rettype funcname arglist\
{\
static char sFuncName[] = #funcname;\
fprintf( pDebugFile, %*s%s()\n, nDebugDepth++, +, sFuncName );
#define RETURN(format,retval) \
fprintf( pDebugFile, %*s%s(% #format )\n, --nDebugDepth, -, sFuncName,
retval );\
return retval;\
}
こんな風に使います。
#define sDebugFileName xxxx.log
FILE *pDebugFile;
int nDebugDepth;
DECLARE_FUNCTION( int, myAdd, (int nA, int nB) )
{
int nRet;
nRet = nA + nB;
RETURN( d, nRet );
}
DECLARE_FUNCTION( int, myMul, (int nA, int nB) )
{
int nRet=0;
int ii;
for( ii=0; ii<nB; ii++ )
{
nRet = myAdd( nRet, nA );
}
RETURN( d, nRet );
}
int main(int argc, char* argv[])
{
int nA;
pDebugFile=fopen( sDebugFileName, w );
nDebugDepth = 1;
nA=myAdd( 2, 3 ); printf( 2+3 = %d\n, nA );
nA=myMul( 2, 3 ); printf( 2*3 = %d\n, nA );
fclose( pDebugFile );
return 0;
}
すると、ログファイルにはこんな出力が得られます。
+myAdd()
-myAdd(5)
+myMul()
+myAdd()
-myAdd(2)
+myAdd()
-myAdd(4)
+myAdd()
-myAdd(6)
-myMul(6)
一つの関数の中でRETURNを複数使うとコンパイルエラーを起こすのでgoto文を使ってでも
「出口1ヶ所」にしなければならなかったり、void関数用には別のRETURNマクロを用意し
なければならなかったり、printf()などの標準関数のログ取得は考慮していなかった
り...で、改良の余地は多々あると思いますが、参考までに。
処理系独自拡張以外では関数名はとれません。
__FILE__ と __LINE__ なら標準で定義されてますから、
これを「タグファイル」形式で出力しておいて、
テキストエディタでジャンプ........ってのはダメですか<次善策
....ログの形式が規定されてると厳しいかも。
ちなみに、処理系依存に関してですが、私の知る限り、
GNU と VC7.1 なら __FUNCTION__ 等で関数名が取れます。
※いのぞ さんの環境(VC++ V6.0)では使えませんので回答にはなりませんが。