跟踪静态内联函数

时间:2019-01-05 05:50:14

标签: c static macros inline

我正在尝试向我的应用程序中添加一些调试工具,但现在仍然坚持使用static inline函数。正如我从answer中学到的那样,可以将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 :(得分:2)

  

我尝试了此操作,因为静态内联不那么容易出错   宏。

与可能被评估两次的参数一起使用时,宏很危险:

#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);
    ...

但仍在使用预处理器。