Как захватить номер строки в существующем коде в C / C ++? - PullRequest
2 голосов
/ 14 марта 2020

Я пытаюсь выполнить некоторый анализ существующей программы, и мне нужно записывать номера строк, не слишком меняя программу. Я играл с __LINE__ и надеялся сделать что-то вроде этого:

file.h:

void Function( int iLine = __LINE___ );   // original function had no arguments, but now overloaded to default __LINE__

file. cpp:

void Function( int iLine ) {    // original function had no arguments, but now changed to int iLine
    // do something here
    // log iLine number to a file for analysis
}

main. cpp call:

Function();    // call existing function

Однако теперь я знаю, что это не будет работать как iLine это всегда file.h номер строки определения.

Я пробовал StackWalker, но также испытывал трудности и, казалось, немного излишним.

Любые предложения о том, как подойти к этому, сохраняя оригинальный файл изменения минимальные?

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

Вариант 1: использовать функцию типа макроса вместо функции. Макрос развернется в сайт «вызова», что даст правильную строку. Сам макрос может быть таким же простым, как передача аргумента в правильную функцию.

Вариант 2. Используйте взамен std::source_location, который будет представлен в следующем c ++ 20.

1 голос
/ 14 марта 2020

Вы можете посмотреть, как определяется макрос ASSERT().

Если я хорошо помню, это примерно так:

#define ASSERT(x) _assert( (x), __FILE__, __LINE__ );
void _assert( bool expression, const char* pfile, int line );

Итак, макрос ASSERT() используется в качестве оболочки для функции _assert(), поэтому она раскрывается на сайте вызова и не имеет значения, будет ли целевая функция встроена или нет.

...