我正在尝试向我的应用程序中添加一些调试工具,但现在仍然坚持使用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__); \
答案 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);
...
但仍在使用预处理器。