gpt4 book ai didi

c++ - 将 __VA_ARGS__ 转换为字符串

转载 作者:行者123 更新时间:2023-11-28 01:55:42 27 4
gpt4 key购买 nike

我正在尝试重新定义可变参数宏以使用 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。它也不返回指向字符串的指针,因此您不能将结果分配给 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

关于c++ - 将 __VA_ARGS__ 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41288780/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com