将 __VA_ARGS__ 转换为字符串
Convert __VA_ARGS__ to string
我正在尝试重新定义可变参数宏以使用 cout 而不是 printf。原代码如下:
#define LOGE(...) PRINT_LEVEL(1, __VA_ARGS__);
#define PRINT_LEVEL(level,...) do { \
if (debug_components.DEBUG_COMPONENT >= level) \
{ printf("[%s]: ", levels_strings[level-1]); printf(__VA_ARGS__); printf("\n"); } \
}while(0)
我将其转换为以下内容以使用 cout 而不是 printf:
#define PRINT_LEVEL(level,...) do { \
if (debug_components.DEBUG_COMPONENT >= level) \
{ std::string argString; sprintf(argString, __VA_ARGS__); std::cout << "[" << levels_strings[level-1] << "]" << argString << "\n";} \
}while(0)
出于某种原因,__VA_ARGS__
可以与 printf 一起正常工作,但不能与 sprintf 一起工作。它也不适用于 cout。我想知道将 __VA_ARGS__
转换为字符串的正确方法,或者失败时,使用 cout 将其打印出来的正确方法。
sprintf
需要一个额外的参数,即要写入输出的数据缓冲区。如果不进行更改以提供该缓冲区,就不能将 printf
换成 sprintf
。它也没有 return 指向字符串的指针,因此您不能将结果分配给 std::string
并期望它起作用。如果您操作不安全(假设最大缓冲区长度),那么简单如:
#define PRINT_LEVEL(level,...) do { \
if (debug_components.DEBUG_COMPONENT >= level) \
{
char buf[1024];
sprintf(buf, __VA_ARGS__); std::cout << "[" << levels_strings[level-1] << "]" << buf << "\n";} \
}while(0)
会起作用(如果通过 snprintf
不可靠,可以通过截断安全地完成),但是如果您仍然使用 C++ 类型,您可能需要查看 a non-printf
-y solution
我用错了sprintf。这是正确的代码:
char argString[1024]; sprintf(argString, __VA_ARGS__);
现在 argString 保存 VA_ARGS.
的值
我正在尝试重新定义可变参数宏以使用 cout 而不是 printf。原代码如下:
#define LOGE(...) PRINT_LEVEL(1, __VA_ARGS__);
#define PRINT_LEVEL(level,...) do { \
if (debug_components.DEBUG_COMPONENT >= level) \
{ printf("[%s]: ", levels_strings[level-1]); printf(__VA_ARGS__); printf("\n"); } \
}while(0)
我将其转换为以下内容以使用 cout 而不是 printf:
#define PRINT_LEVEL(level,...) do { \
if (debug_components.DEBUG_COMPONENT >= level) \
{ std::string argString; sprintf(argString, __VA_ARGS__); std::cout << "[" << levels_strings[level-1] << "]" << argString << "\n";} \
}while(0)
出于某种原因,__VA_ARGS__
可以与 printf 一起正常工作,但不能与 sprintf 一起工作。它也不适用于 cout。我想知道将 __VA_ARGS__
转换为字符串的正确方法,或者失败时,使用 cout 将其打印出来的正确方法。
sprintf
需要一个额外的参数,即要写入输出的数据缓冲区。如果不进行更改以提供该缓冲区,就不能将 printf
换成 sprintf
。它也没有 return 指向字符串的指针,因此您不能将结果分配给 std::string
并期望它起作用。如果您操作不安全(假设最大缓冲区长度),那么简单如:
#define PRINT_LEVEL(level,...) do { \
if (debug_components.DEBUG_COMPONENT >= level) \
{
char buf[1024];
sprintf(buf, __VA_ARGS__); std::cout << "[" << levels_strings[level-1] << "]" << buf << "\n";} \
}while(0)
会起作用(如果通过 snprintf
不可靠,可以通过截断安全地完成),但是如果您仍然使用 C++ 类型,您可能需要查看 a non-printf
-y solution
我用错了sprintf。这是正确的代码:
char argString[1024]; sprintf(argString, __VA_ARGS__);
现在 argString 保存 VA_ARGS.
的值