c++ - 如何使用宏打印可变数量的参数?

标签 c++ c-preprocessor variadic-macros

我想定义一个具有可变数量参数的宏,它打印每个给定参数的名称和值。

例如:

MACRO(x)会打印 x = 123 MACRO(x,y)会打印 x,y = 123,666

更好的宏会更具可读性

BETTER_MACRO(x,y)会打印 x = 123, y = 666

对于一个变量,我可以管理:

#define MACRO(...) cout << #__VA_ARGS__ << " = " << __VA_ARGS__ << endl;

对于更多,它不起作用。

通过这种方式,我想到了一些辅助问题。

1) 如何获取给宏的变量个数? 2) 如何访问每个参数?

天真地猜测,我们可以回答这两个问题。

那么我们希望通过下面的方式来定义宏。

#define BETTER_MACRO(...) {for (int i=0;i<=nb_variables;i++) {cout << #var[i] << var[i];}}

最佳答案

#define MACRO(...) function(#__VA_ARGS__, __VA_ARGS__)

// base case for template recursion when one argument remains
template <typename Arg1>
void function(const char* name, Arg1&& arg1)
{
    std::cout << name << " = " << arg1 << std::endl;
}

// recursive variadic template for multiple arguments
template <typename Arg1, typename... Args>
void function(const char* names, Arg1&& arg1, Args&&... args)
{
    const char* comma = strchr(names + 1, ',');
    std::cout.write(names, comma - names) << " = " << arg1;
    function(comma, args...);
}

上面有一个有点古怪的特性,无论你在 MACRO 调用中包含(或不包含)的间距都将反射(reflect)在输出中。

关于c++ - 如何使用宏打印可变数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22964799/

相关文章:

c++ - 使用 mmap() 时从 'void*' 到 'char*' 的无效转换

c++ - 使用宏迭代生成函数声明

c - C 中的 token 粘贴

c - 可变参数和 x64

c++ - 为什么使用 openMP 的 VC++ 矩阵时间 vector 比异步更快?

c++ - C++ Switch 语句中的十六进制值

c++ - 程序有时会崩溃

c++ - 添加预处理器 #define 以更改包含哪些 header 以及调用哪些函数

C预处理器: How to create a character literal?

c++ - 你能解释一下这段代码吗?