获取调用函数的C文件的名称

时间:2016-01-04 06:49:39

标签: c logging

我在“C”中实现了一个记录器,核心功能是:

void log(Level tag, const char *message)

此函数将在客户端文件中调用,该文件与我的log.c文件不同。

我的问题是:

该函数如何获取调用者文件的名称而不将其作为参数传递(如添加另一个char *)参数,然后在调用者文件中传递它{1}}? / p>

谢谢。

3 个答案:

答案 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