Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ snprintf变量列表不将枚举转换为字符*_C++_C_Printf_Variadic Functions - Fatal编程技术网

C++ snprintf变量列表不将枚举转换为字符*

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]; \

我一直在做一项任务,以改变我的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(字符*,大小,常量字符*,…)'

消除此问题的一个明显选项是为枚举打印提供整数类型转换

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

请分享你的观点

提前谢谢

通过将
##
运算符附加到
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”)时,一切都很好;现在我弄不清楚我的旧代码和用“”表示日志字符串的代码之间的区别是什么。您能给出答案吗?请阅读有关令牌连接运算符的内容: