c++ - 使用可变参数宏打印多个调试行

标签 c++ qt c++11 variadic-macros

我正在使用 qt、gcc 和 c++11。

我想要一个以这种方式工作的调试功能:

int a = 1;
float b = 2.2;
QString c = "hello";

用法:

myFunc(a);       // print a 1 
myFunc(a, b);    // print a 1 b 2.2 
myFunc(a, b, c); // print a 1 b 2.2 c hello

我可以只使用可变参数模板函数来解决它,但我还需要打印变量名称。

对于只有 1 个参数这个宏就可以正常工作

#define VAR(var) qDebug() << #var << var;

所以我尝试使用可变参数宏来解决我的问题,例如:

#define MVAR(...) VAR(__VA_ARGS__)

它适用于 1 个变量,但是当我尝试使用更多变量时,它会给出“宏 VAR 传递了 2 个参数,但只需要 1 个”。

我该如何解决这个问题?

最佳答案

您正在使用两个参数调用宏 VAR,因为 __VA_ARGS__ 扩展为完整的逗号分隔列表。但该宏只接受一个参数。

您可以做的仍然是使用可变参数模板来实现它,但使用宏来转发变量名称和值。不幸的是,它需要相当多的样板来合并和拆分可变参数宏参数。我相信 Boost 有一个库可以更轻松地表达这一点,但我从未使用过它。

#define EXPAND(x) x
#define COUNT_ARGS(...) COUNT_ARGS_(__VA_ARGS__, COUNT_ARGS_RSEQ())
#define COUNT_ARGS_(...) EXPAND(COUNT_ARGS_N(__VA_ARGS__))
#define COUNT_ARGS_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, N, ...) N
#define COUNT_ARGS_RSEQ() 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

#define EXPAND_NAME_VALUE(argvalue, argname) argname, argvalue

#define EXPAND_ARGS(how, ...) EXPAND_ARGS_(how, COUNT_ARGS(__VA_ARGS__), __VA_ARGS__)
#define EXPAND_ARGS_(how, N, ...) EXPAND_ARGS__(how, N, __VA_ARGS__)
#define EXPAND_ARGS__(how, N, ...) EXPAND(EXPAND_ARGS_##N(how, __VA_ARGS__))
#define EXPAND_ARGS_1(how, arg, ...) how(arg, #arg)
#define EXPAND_ARGS_2(how, arg, ...) how(arg, #arg), EXPAND(EXPAND_ARGS_1(how, __VA_ARGS__))
#define EXPAND_ARGS_3(how, arg, ...) how(arg, #arg), EXPAND(EXPAND_ARGS_2(how, __VA_ARGS__))
#define EXPAND_ARGS_4(how, arg, ...) how(arg, #arg), EXPAND(EXPAND_ARGS_3(how, __VA_ARGS__))
// ...

#define MVAR(...) Print(EXPAND_ARGS(EXPAND_NAME_VALUE, __VA_ARGS__))

#include <string>
#include <iostream>

template <typename T>
void Print(const std::string& name, T&& value)
{
    std::cout << name << ": " << value << "\n";
}
template <typename T, typename... Ts>
void Print(const std::string& name, T&& value, Ts&&... other)
{
    Print(name, value);
    Print(std::forward<Ts>(other)...);
}

int main()
{
    int heyo = 5;
    float whoo = 7.5;
    double eyy = 2;
    std::string s = "hello";
    MVAR(heyo, whoo, eyy, s);
}

输出:

heyo: 5
whoo: 7.5
eyy: 2
s: hello

关于c++ - 使用可变参数宏打印多个调试行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49154021/

相关文章:

c++ - 检查字符串单词是否包含数字和不包含数字

c++ - 怎么解析: constructing unnamed temporary with braced init list

c++ - LLVM 查找每条分配内存的指令

c++ - 宏 : How do I change each value in __VA_ARGS__

c++ - 使用 QPixmap 作为 OpenGL 纹理

c++ - 将 std::unique_ptr 移动到 std::vector 内的新位置

c++ - Qt 设计器 Q PaintError

c++ - 如何在QML 的RichText 中使用html 源将图片居中?

c++ - 为什么我收到此错误 : constexpr' is not valid here

C++11 可变大小 POD 结构