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

[戻る]
いのぞ 2005/04/08(金) 14:31:49
Windows XP
VC++ V6.0

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

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

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

wood 2005/04/08(金) 16:01:36
回答ではありません
関数名の取得レベルはどこまで必要なのでしょうか

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

tib 2005/04/08(金) 18:00:05
昔、こんなマクロを作ったことがあります。

#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 2005/04/09(土) 01:15:35
処理系独自拡張以外では関数名はとれません。

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

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


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

古いスレッドには追加発言できません。