Получить номер строки вызываемой функции C

Есть ли способ получить номер строки, в которой была вызвана функция в 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__);
    }

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 раз дороже этих усилий.

Другие вопросы по тегам