c - 通过带有变量名称的宏进行调试打印

标签 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);

有没有办法,如何摆脱 DEBUG_PRINT 中的那些 STR(x) ,使变量名称保持可见,整体格式保持漂亮几乎相同?我不介意放入格式说明符,尽管我的第一个想法是如果可能的话也删除它们。最重要的是保留可变数量的参数。

所以我的问题是,如何编写一个宏来执行“ pretty-print ”,而不需要调用 STR(x) - 像这样:DEBUG_PRINT_VARS(min_a, max_a, min_c, max_c, min_m ,max_m,d)

最佳答案

好吧,我现在通过使用 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");

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

关于c - 通过带有变量名称的宏进行调试打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40830482/

相关文章:

c - 用C读取文件

python - 在MacOS上安装Python3

php - 在 php printf 函数中更改表的颜色时发生错误

solaris - 多线程 printf 与 write(2) 缓冲

c - 尽管使用数组的字符,但指向整数的指针不兼容

c - 当 super 结构引用非常量时如何使用 const C 结构?

无法在 C 程序中打开 16 个文件(核心转储)

c - 忽略分号 C 语法

c++ - 为什么链接器看不到我的函数(定义宏来替代系统日志)?

C-编号检查功能给出无限循环