0

以下のようなことをせずに、Cで関数が呼び出された行番号を取得する方法はありますか?定義はしばらくすると面倒になり、{の代わりにDPを使用する必要があり、通常のように読みにくくなります。しかし、すべての関数の最初のパラメーターとしてLINEを追加することは、私がやりたくないことです。

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #define println(x,...) printf(x,##__VA_ARGS__);printf("\n");
    /*
     *I would like to be able to replace __LINE__ with the line
     *each function was called on, or replace my DP define completely...
    */
    #ifdef _DEBUG_
        #define DP { println("%s:%d\t%s()",__FILE__,__LINE__,__FUNCTION__);
    #else
        #define DP {
    #endif
    void calledFunc()
    DP
        println("something something something");
    }
    void cFunc(int line)
    {
        println("%s:%d\t%s()",__FILE__,line,__FUNCTION__);
    }
    int main()
    DP
        calledFunc();
        /* ...and I don't want to have to do this all the time either*/
        cFunc(__LINE__);
    }
4

1 に答える 1

1

行のファイル名/番号を出力する代わりに、適切な方法があります。「LocationID」またはLIDと呼ばれます。

LID は、プロジェクト全体のカウンターから生成される数値です。カウンタの最新の値は、ソース ファイルに保存し、他のソース ファイルと同様にソース管理システムにチェックイン/チェックアウトする必要があります。カウンターの値はスクランブルできます。これにより、適切な使用が強制されます。次のように使用します。

   #ifdef _DEBUG_
        #define DP(x, msg) println("%d: %s", x, msg);
   #endif

そしてあなたのソースで:

DP (3517, "Here we are.")

LID の利点は次のとおりです。

  1. これらは、ファイル/関数の名前変更を含む、ソース ファイルの変更に対して安定しています。
  2. それらはソースで簡単に見つけることができます。
  3. ログ ファイルは、ファイル名と関数名よりもはるかにコンパクトで明確です。

私はこれを数回使用しましたが、それは良いことがわかりました。開発者間での LID 値の生成と配布はオーバーヘッドですが、結果はこの労力の 10 倍の価値があります。

于 2012-08-20T00:54:33.753 に答える