C++ snprintf变量列表不将枚举转换为字符*
我一直在做一项任务,以改变我的CPP代码库中当前的日志记录机制 当前的一个类似于printf,我们可以在其中写入C++ snprintf变量列表不将枚举转换为字符*,c++,c,printf,variadic-functions,C++,C,Printf,Variadic Functions,我一直在做一项任务,以改变我的CPP代码库中当前的日志记录机制 当前的一个类似于printf,我们可以在其中写入 MYLOGGING(("Example Log :%s, Example Num: %d", String, Number)); 现在,作为将其修改为新日志机制的一部分,我希望使用snprintf()将此完整输出转换为字符串。为此,我使用了一个变量列表 代码就像 #define MYLOGGING(log_string,...) do { \ char buff[1024]; \
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(字符*,大小,常量字符*,…)'
消除此问题的一个明显选项是为枚举打印提供整数类型转换
由于这可能是一个乏味的过程,我很想知道我是否可以用其他方式解决这个问题
请分享你的观点
提前谢谢 通过将##
运算符附加到u VA_uargs_u
,可以将格式参数转换为常量字符*
:
snprintf(buff, sizeof(buff), log_string, ##__VA_ARGS__);
改为:
snprintf(buff, sizeof(buff), log_string, __VA_ARGS__);
这种转换应该是有效的
事实上,在仔细看了你的问题之后,我注意到了另一个问题。
##
运算符确实不常见,可能不正确,但是,问题的主要原因似乎是调用MYLOGGING
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
的调用。因此,删除宏中的##
,以及调用站点中的额外参数。谢谢你,格朗佩特。当我将它更改为snprintf(buff,sizeof(buff),“log_string”,“VA#u ARGS”)时,一切都很好;现在我弄不清楚我的旧代码和用“”表示日志字符串的代码之间的区别是什么。您能给出答案吗?请阅读有关令牌连接运算符的内容: