考虑:
#include <bits/stdc++.h>
using namespace std;
#define __deb(X...) (cout << "[" << #X << "]:" << X)
template <typename... type>
void debug(type &&... args)
{
((__deb(args)), ...);
}
int main()
{
int a = 1, b = 3;
debug(a,b);
return 0;
}
我得到了像[args]:1[args]:3
这样的输出,但我想要像[a]:1[b]:3
这样的输出。
3条答案
按热度按时间j2cgzkjk1#
一种方法是使用
#__VA_ARGS__
引用所有宏参数,并在C++函数中解析该字符串。示例:
可能的输出:
Demo
使用
std::source_location
的C++20版本:Demo
g2ieeal72#
下面是我的一个简单尝试,它使用一个宏
FOO
来创建一对变量名和它的值,并将参数传递给一个可变参数函数:Demo
或者,为了避免对
debug
中的每个变量都使用宏调用FOO
,可以将debug
定义为接受#__VA_ARGS__
(参数字符串)和__VA_ARGS__
(参数值)的宏。然后解析每个变量名和值:Demo
yhqotfr83#
问题是MACRO是在
void debug(type &&... args)
的上下文中使用的,这对a
和b
这两个名称并不熟悉。一个可能的解决方案是实现一个更大的MACRO,它包含几个var,并调用一个处理单个var的子MACRO(您已经实现了)。
这样,初始的MACRO调用将发生在具有所需变量的调用函数的上下文中