snprintf变量列表不会将enum转换为char*
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
时出现了多余的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。
相关文章:
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 使用char类型将decimal转换为string,将string转换为decimal
- 如何在对<char>C++程序进行逆向工程的同时将 std::basic_string 转换为 Rust 可读值?
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 如何使用多次 memcpy 转换回 std::vector<unsigned char>?
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 转换char*时的值不同
- Boost Python 不会自动转换 char* 数据成员
- 除了转换char*之外,还有更好的方法来获得一个变量值吗?
- 如何跨平台转换char*到long long(64位)
- 用atof转换char数组中的浮点数
- C转换char[]为时间戳;