如何编写可以附加调用者';在C中记录输出的名称
我需要一个C语言的日志函数或宏,它应该在Linux中工作,可以接受格式字符串和参数列表,并且可以将调用方的函数名附加到输出字符串中 这里有一个例子。假设日志函数(宏)称为smart_log。它看起来像:如何编写可以附加调用者';在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
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值得一对夫妇随机回答上升。我把它放到我的代码片段库中。谢谢,先生。相关:。