我在“C”中实现了一个记录器,核心功能是:
void log(Level tag, const char *message)
此函数将在客户端文件中调用,该文件与我的log.c
文件不同。
我的问题是:
该函数如何获取调用者文件的名称而不将其作为参数传递(如添加另一个char *
)参数,然后在调用者文件中传递它{1}}? / p>
谢谢。
答案 0 :(得分:4)
首先要做的是将log()
重命名为debug_log()
或其他内容,以便您可以使用#include <math.h>
以及日志记录机制。谢谢,@ JonathanLeffler。
接下来你要做的就是改变debug_log
,所以它接受文件名作为参数。
void debug_log(Level tag, const char *message, char const* filename);
然后,添加一个宏以帮助自动使用宏__FILE__
。
#define LOG_MESSAGE(tag, message) debug_log((tag), (message), __FILE__)
然后,在客户端代码中使用宏而不是函数。
LOG_MESSAGE(my_tag, my_message);
答案 1 :(得分:2)
将它设为宏,它总是将__FILE__
传递给它调用的函数。
这样记录器调用看起来更干净(你没有看到额外的参数)。
例如,要始终添加函数名称和行号,我使用以下也具有变量参数,因此您可以使用格式字符串和参数调用printf()
。
这需要GCC宏功能。
#define DBG(x, args...) ({ \
if (debug) { \
fprintf(stderr, "%s:%d: " x "\n", __func__, __LINE__, ##args); \
} \
})
答案 2 :(得分:0)
如果您使用GCC并且不介意使用-rdynamic
进行编译,则可以使用函数backtrace()
来获取回溯,然后使用dladdr()
来查找名称单个函数(列表中的第一个函数,由backtrace()
返回),或backtrace_symbols
来获取堆栈中所有函数的符号,并仅使用第一个函数。
此处有更多详情 - https://stackoverflow.com/a/351980/28494
有关详细信息,请参阅man
。