#用C定义调试打印的宏?

#用C定义调试打印的宏?

尝试创建一个宏,在定义调试时可用于打印调试消息,如以下伪代码:

#define DEBUG 1#define debug_print(args ...) if (DEBUG) fprintf(stderr, args)

这是如何通过宏实现的?


繁花如伊
浏览 667回答 3
3回答

慕桂英546537

我用的是这样的东西:#ifdef DEBUG #define D if(1) #else  #define D if(0) #endif我只是用D作为前缀:D printf("x=%0.3f\n",x);编译器看到调试代码,没有逗号问题,而且它在任何地方都能工作。同样,当printf仅当您必须转储数组或计算程序本身多余的诊断值时,这是不够的。编辑:好的,当有else在附近的某个地方可以被注入if..这是一个超越它的版本:#ifdef DEBUG #define D  #else  #define D for(;0;)#endif

一只名叫tom的猫

对于可移植的(ISO C 90)实现,可以使用双括号,如下所示;#include&nbsp;<stdio.h>#include&nbsp;<stdarg.h>#ifndef&nbsp;NDEBUG#&nbsp;&nbsp;define&nbsp;debug_print(msg)&nbsp;stderr_printf&nbsp;msg#else#&nbsp; &nbsp;define&nbsp;debug_print(msg)&nbsp;(void)0#endifvoidstderr_printf(const&nbsp;char&nbsp;*fmt,&nbsp;...){ &nbsp;&nbsp;va_list&nbsp;ap; &nbsp;&nbsp;va_start(ap,&nbsp;fmt); &nbsp;&nbsp;vfprintf(stderr,&nbsp;fmt,&nbsp;ap); &nbsp;&nbsp;va_end(ap);}intmain(int&nbsp;argc,&nbsp;char&nbsp;*argv[]){ &nbsp;&nbsp;debug_print(("argv[0]&nbsp;is&nbsp;%s,&nbsp;argc&nbsp;is&nbsp;%d\n",&nbsp;argv[0],&nbsp;argc)); &nbsp;&nbsp;return&nbsp;0;}或者(Hackish,不推荐)#include&nbsp;<stdio.h>#define&nbsp;_&nbsp;,#ifndef&nbsp;NDEBUG#&nbsp;&nbsp;define&nbsp;debug_print(msg)&nbsp;fprintf(stderr,&nbsp;msg)#else#&nbsp;&nbsp; define&nbsp;debug_print(msg)&nbsp;(void)0#endifintmain(int&nbsp;argc,&nbsp;char&nbsp;*argv[]){ &nbsp;&nbsp;debug_print("argv[0]&nbsp;is&nbsp;%s,&nbsp;argc&nbsp;is&nbsp;%d"_&nbsp;argv[0]&nbsp;_&nbsp;argc); &nbsp;&nbsp; &nbsp;&nbsp;return&nbsp;0;}
打开App,查看更多内容
随时随地看视频慕课网APP