[英]snprintf variable list doesnt convert enum to char*
我一直在做一项任务,以更改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
出现了额外的MYLOGGING
MYLOGGING(("Example Log :%s, Example Num: %d", String, Number));
如果使用-E
标志在GCC中编译对该宏的调用以输出预处理的源,则将从宏中扩展以下行:
do { char buff[1024]; memset(buff, 0, sizeof(buff)); snprintf(buff, sizeof(buff), ("Example Log :%s, Example Num: %d", String, Number)); ....
您会看到()
仍然存在,从而snprintf
了对snprintf
的调用。 因此,请删除宏中的##
和调用站点中的多余括号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.