logに実行された関数を書き込む方法について – プログラミング – Home

logに実行された関数を書き込む方法に...
 
通知
すべてクリア

logに実行された関数を書き込む方法について


いのぞ
 いのぞ
(@いのぞ)
ゲスト
結合: 20年前
投稿: 1
Topic starter  

Windows XP
VC++ V6.0

現在Windowsアプリの開発をしております。
プログラムの仕様でlogファイルを出力することになっているのですが
モジュール実行時に呼ばれた関数の戻り値(TRUEやFALSE等)を
そのlogファイルに書き込む処理をしております。

そこでお聞きしたいのですが、
それぞれ実行した際に呼び出した関数もlogファイルに
書込みたいのですが、呼び出した関数もわかるマクロの
様なものはあるのでしょうか?
log関数というのがあるようですが、これは違うようでした。

何かアドバイス頂けると有難いです。
宜しくお願い致します。


引用解決済
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

回答ではありません
関数名の取得レベルはどこまで必要なのでしょうか

たとえば 「printf」の中身まで
それとも、自作関数名までで良い
後者でよければ、関数ごとにログ出力関数記述すればよいこと
だと思います
前者であれば、俺はわかりません


返信引用
tib
 tib
(@tib)
ゲスト
結合: 22年前
投稿: 468
 

昔、こんなマクロを作ったことがあります。

#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()などの標準関数のログ取得は考慮していなかった
り...で、改良の余地は多々あると思いますが、参考までに。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

処理系独自拡張以外では関数名はとれません。

__FILE__ と __LINE__ なら標準で定義されてますから、
これを「タグファイル」形式で出力しておいて、
テキストエディタでジャンプ........ってのはダメですか<次善策

....ログの形式が規定されてると厳しいかも。

ちなみに、処理系依存に関してですが、私の知る限り、
GNU と VC7.1 なら __FUNCTION__ 等で関数名が取れます。
※いのぞ さんの環境(VC++ V6.0)では使えませんので回答にはなりませんが。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました