使用变量名

时间:2016-11-27 15:18:01

标签: c macros printf c-preprocessor variadic-functions

有没有办法,如何将变量名称及其值整齐地传递给调试宏?我现在使用的是"只是"此

#if DEBUG_LEVEL >= 1
#define DEBUG_PRINT(fmt, ...) do{\
fprintf(stderr, ANSI_COLOR_YELLOW "[DEBUG]: %s:%c\t", __FILE__, __LINE__);\
fprintf(stderr, fmt ANSI_COLOR_RESET, __VA_ARGS__);}while(0)
#else
#define DEBUG_PRINT(...)
#endif

#define STR(x) #x

一切都很好,但是当我想输出哪个变量属于哪个名字时,我会使用这样的构造,它很容易变得太麻烦。

DEBUG_PRINT(STR(min_a)": %u\t"STR(max_a)": %u\t"STR(min_c)": %u\t"STR(max_c)":%u\t"STR(min_m)": %u\t"STR(max_m)":%u\t"STR(d)": %d\n", min_a, max_a, min_c, max_c, min_m, max_m, d);

有没有办法,如何以这种方式摆脱STR(x)中的DEBUG_PRINT,变量名称保持可见,整体格式保持不变?我不介意放入格式说明符,尽管我的第一个想法是尽可能地删除它们。最重要的是保留可变数量的参数。

所以我的问题是,如何编写一个宏,这样做"漂亮的打印",而不需要调用STR(x) - 这样的事情:DEBUG_PRINT_VARS(min_a, max_a, min_c, max_c, min_m, max_m, d)

1 个答案:

答案 0 :(得分:0)

好吧,我现在通过使用MAP宏(https://github.com/swansontec/map-macro)来解决它,编辑它以允许两个参数函数,然后具有:

#if DEBUG_LEVEL >= 1
#define DEBUG_PRINT(...) do{\
fprintf(stderr, ANSI_COLOR_YELLOW "[DEBUG]: %s:%d\t", __FILE__, __LINE__);\
MAP(PRINT_ARG, __VA_ARGS__); \
fprintf(stderr, "\n" ANSI_COLOR_RESET);}while(0)
#else
#define DEBUG_PRINT(...)
#endif

#define PRINT_ARG(x, y) fprintf(stderr, #x": "y"\t", x);

并像这样使用

DEBUG_PRINT(min_a, "%u", max_a, "%u", min_c, "%u", max_c, "%u", min_m, "%u", max_m, "%u", d, "%d");

它回答了问题本身,所以这就是我将其作为答案发布的原因,尽管我真的很想找到一种方法,如何生成转换说明符隐式