snprintf变量列表不会将enum转换为char*

snprintf variable list doesnt convert enum to char*

本文关键字:转换 char enum 变量 列表 snprintf      更新时间:2023-10-16

我一直在做一项任务来更改CPP代码库中的当前日志记录机制。

目前的版本有点像printf,我们可以在其中编写

MYLOGGING(("Example Log :%s, Example Num: %d", String, Number));

现在,作为将其修改为新日志记录机制的一部分,我希望使用snprintf()将此完整输出转换为字符串。为此,我使用了一个变量列表。

代码就像

#define MYLOGGING(log_string,...) do { 
char buff[1024]; 
memset(buff, 0, sizeof(buff)); 
snprintf(buff, sizeof(buff), log_string, ##__VA_ARGS__); 
MYNEW_LOG(NewlogParams, buff); 
} while(0)

现在,我面临一个问题。现有的日志记录有许多实例,其中一些枚举值是使用简单的%d打印的。在这种情况下,使用这个新代码,它会抛出以下错误。

错误:无法将参数"3"的"enumType"转换为"const char*"'int snprintf(char*,size_t,const char*,…)'

消除这种情况的一个明显选项是为枚举打印提供整数类型强制转换。

由于这可能是一个乏味的过程,我很想知道我是否可以用其他方式解决这个问题?

请分享你的观点。

提前谢谢。

通过将##运算符附加到__VA_ARGS__,可以将格式参数转换为const char *:

snprintf(buff, sizeof(buff), log_string, ##__VA_ARGS__);

将其更改为:

snprintf(buff, sizeof(buff), log_string, __VA_ARGS__);

并且转换应该起作用。


事实上,在仔细研究了你的问题之后,我注意到了另一个问题。##运算符确实不常见,而且可能不正确,但是,问题的主要原因似乎是调用MYLOGGING 时出现了多余的parens

MYLOGGING(("Example Log :%s, Example Num: %d", String, Number));

如果您在GCC中用-E标志编译对该宏的调用以输出预处理的源代码,您将从宏中得到以下行:

do { char buff[1024]; memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff), ("Example Log :%s, Example Num: %d", String, Number)); ....

您可以看到()仍然在那里,打乱了对snprintf的调用。因此,删除宏中的##和调用站点中多余的parens。