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 回答