如何编写可以附加调用者';在C中记录输出的名称

如何编写可以附加调用者';在C中记录输出的名称,c,logging,macros,C,Logging,Macros,我需要一个C语言的日志函数或宏,它应该在Linux中工作,可以接受格式字符串和参数列表,并且可以将调用方的函数名附加到输出字符串中 这里有一个例子。假设日志函数(宏)称为smart_log。它看起来像: smart_log(const char *fmt, ...) [example_function]: try to output number 1 第一个参数fmt是一个格式字符串,就像printf中的格式字符串一样。 下面的fmt是要提供给fmt的附加参数列表 假设一个名为example

我需要一个C语言的日志函数或宏,它应该在Linux中工作,可以接受格式字符串和参数列表,并且可以将调用方的函数名附加到输出字符串中

这里有一个例子。假设日志函数(宏)称为smart_log。它看起来像:

smart_log(const char *fmt, ...)
[example_function]: try to output number 1
第一个参数fmt是一个格式字符串,就像printf中的格式字符串一样。 下面的fmt是要提供给fmt的附加参数列表

假设一个名为example_函数的函数以这种方式调用smart_log:

void example_function() {
    smart_log("try to output number %d\n", 1);
}
然后,日志记录字符串如下所示:

smart_log(const char *fmt, ...)
[example_function]: try to output number 1
所以关键的一点是smart_log将调用者的函数附加到格式字符串中


我不知道如何在C中实现这一点。我认为可以使用宏来实现这一点。

这非常依赖于系统/编译器,因为获取函数名的确切咒语在很大程度上取决于编译器。对于Visual C++,你可以使用宏<代码>函数>代码>在编译时获取当前函数名。 为了确保在每次调用
smart_log
时都不会将宏放入日志中,而是记录正确的函数名,您可以通过宏调用日志函数,以便在正确的上下文中计算获取函数名的宏-如果您只需将宏添加到函数名,您将始终获得日志函数的名称

因此,与其称之为:

smart_log("log message");
你打电话:

SMART_LOG("log message");
这反过来又被定义为:

#define SMART_LOG(message) smart_log(__FUNCTION__, message)

这是在假设日志函数将函数名作为第一个参数的情况下进行的,因此可以根据需要进行调整。

如果不想使用宏,可以使用堆栈来实现。
smart\u log
函数将位于调用它的函数的顶部


请参见定义宏-智能日志-该宏将
\uuuuuuuuuu文件
\uuuuu函数
\uuuuuu行
作为参数传递到
智能日志
。然后,无论何时使用
SMART\u LOG
,它都会自动为
SMART\u LOG
提供调用者的代码位置。但是请注意,
\uuuuu FUNCTION\uuuuu
是非标准的,但在GCC中是可用的(我相信还有Visual C),请参见:)。

在C中,函数没有可移植的方法来了解其调用者。但您是对的,宏可以:

#define smart_log(...) ( printf("[%s]: ", __func__) , printf(__VA_ARGS__) )
定义了功能(C99/C11 6.4.2.2 p.1)

就好像在每个函数定义的左大括号之后,声明

static const char
\uuuu func\uuu
[]=“函数名”

出现,其中function name是词汇封闭函数的名称



感谢您改进了我最初的尝试

Linux,Windows,Mac到底是什么?看看这个:@RaydelMiranda-Linux。我编辑了这个问题。好点,听起来好像OP想要一个在C和C++中工作的解决方案,我真的不知道一个便携式宏来实现这个。不幸的是,@ PioTrs的建议。赞成<>代码>{函数〉/COD>也适用于所有的C99和C11编译器(因为C标签是当前包含的)。谢谢,我不确定在C99中是否可以使用“代码>{函数} /CODE”。同时,C++标签已经被删除了,但是说,它确实是按照标准定义的。不如改为
#定义智能日志(…)(printf([%s]:”、uuu func)、printf(u VA_ARGS_u))
`@HagenvonEitzen明星级。@HagenvonEitzen值得一对夫妇随机回答上升。我把它放到我的代码片段库中。谢谢,先生。相关:。