c++ - 如何增强这个变量转储调试宏的可变性?

标签 c++ c-preprocessor variadic-macros

第一个工作代码:

#include <iostream>

// NOTE: requires compiler which has __PRETTY_FUNCTION__, like gcc or clang
#define DUMP(v) std::cerr << __PRETTY_FUNCTION__ << ':' << __LINE__ << ':' << #v << "='" << (v) << "'\n"

int main(int argc) {

    DUMP(argc);
    DUMP(argc+1);
    return 0;
}

它给出了 stderr 输出(gcc):

int main(int):8:argc='1'
int main(int):9:argc+1='2'

现在我想要带有任意数量参数的可变参数宏,例如

DUMP(argc, argc+1); 可以工作,输出如下:

int main(int):8:argc='1',argc+1='2'


但我还无法想出一个好的解决方案。这甚至可以通过宏实现吗?如果没有,模板或者宏和模板的组合怎么样?如果需要,C++11 和 Boost 都可以,如果没有标准方法,解决方案可以是 gcc 特定的。寻找实际的代码,这使得可变的转储像上面描述的那样工作,或者至少显示等效的信息。

最佳答案

使用Boost.PP ,你可以这样写:

#define DUMP_EACH(r, data, v) std::cerr << __PRETTY_FUNCTION__ << ':' << __LINE__ << ':' << #v << "='" << (v) << "'\n"
#define DUMP(...) BOOST_PP_SEQ_FOR_EACH(DUMP_EACH, ~, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__))

编译时您还需要添加-DBOOST_PP_VARIADICS=1。如果您不想使用 boost,您可以编写一个简单的 FOR_EACH 宏来迭代每个参数,如下所示:

/* This counts the number of args */
#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1)

/* This will let macros expand before concating them */
#define PRIMITIVE_CAT(x, y) x ## y
#define CAT(x, y) PRIMITIVE_CAT(x, y)

/* This will call a macro on each argument passed in */
#define FOR_EACH(macro, ...) CAT(FOR_EACH_, NARGS(__VA_ARGS__))(macro, __VA_ARGS__)
#define FOR_EACH_1(m, x1) m(x1)
#define FOR_EACH_2(m, x1, x2) m(x1) m(x2)
#define FOR_EACH_3(m, x1, x2, x3) m(x1) m(x2) m(x3)
#define FOR_EACH_4(m, x1, x2, x3, x4) m(x1) m(x2) m(x3) m(x4)
#define FOR_EACH_5(m, x1, x2, x3, x4, x5) m(x1) m(x2) m(x3) m(x4) m(x5)
#define FOR_EACH_6(m, x1, x2, x3, x4, x5, x6) m(x1) m(x2) m(x3) m(x4) m(x5) m(x6)
#define FOR_EACH_7(m, x1, x2, x3, x4, x5, x6, x7) m(x1) m(x2) m(x3) m(x4) m(x5) m(x6) m(x7)
#define FOR_EACH_8(m, x1, x2, x3, x4, x5, x6, x7, x8) m(x1) m(x2) m(x3) m(x4) m(x5) m(x6) m(x7) m(x8)

然后你可以像这样定义你的转储宏:

#define DUMP_EACH(v) std::cerr << __PRETTY_FUNCTION__ << ':' << __LINE__ << ':' << #v << "='" << (v) << "'\n"
#define DUMP(...) FOR_EACH(DUMP_EACH, __VA_ARGS__)

关于c++ - 如何增强这个变量转储调试宏的可变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464032/

相关文章:

C++ - 随机选择字符串而不选择它超过一次

C#define based in another #define 错误

c++ - #elseif 与 #elif(C/C++ 预处理器)

c++ - 有没有办法在 Visual C++ 中编写带有变量参数列表的宏?

c++ - 如何向 C++ 日志宏添加额外参数

c - 如何使用可变参数宏附加到数组?

c++ - 使用散列样式 SYSV 编译 libstdc++

c++ - 什么时候会使用共享指针 vector ,什么时候会使用纯对象 vector ?

在 C 中跨多个源文件创建调度表注册函数

c++ - 我怎样才能找到并显示数据文件中的内容?