Отслеживание статической встроенной функции - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь добавить средство отладки в мое приложение, и теперь использую функцию static inline. Как я узнал из этого ответа , было возможно поместить определение функции static inline в заголовочный файл, чтобы функция не создавалась дважды, если файл включен несколько раз.

Поэтому мне было любопытно, и я попытался определить аналогичную функцию static inline для отслеживания вызова и поместить ее в заголовочный файл:

#ifndef TRACE_H
#define TRACE_H

static inline void trace(){
    printf("Current line %d, func %s, file %s\n", __LINE__, __func__, __FILE__);
}

#endif //TRACE_H

Я пробовал это, потому что static inline гораздо менее подвержен ошибкам, чем макрос. Проблема в том, что простой

int main(int argc, char const *argv[])
{
    trace(); 
}

печатает Current line 8, func trace, file /home/somename/include/trace.h, что явно бесполезно.

Так что для целей трассировки есть какой-то другой способ, кроме определения макроса

#define trace() \
    printf("Current line %d, func %s, file %s\n", __LINE__, __func__, __FILE__); \

1 Ответ

0 голосов
/ 05 января 2019

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

Макросы опасны при использовании с параметрами, которые могут быть оценены дважды:

#define min(a, b) ((a) < (b)) ? (a) : (b)

Но это не тот случай.

Единственный обходной путь, который я вижу:

#define SOURCE __LINE__, __func__, __FILE__

static inline void trace(int line, const char *func, const char *file)
{
    printf("Current line %d, func %s, file %s\n", line, func, file);
}

int main(void)
{
    trace(SOURCE);
    ...

Но все еще использую препроцессор.

...