C语言,调试必备的DEBUG宏定义 #include <stdio.h> #include <stdarg.h> //仅仅是打印函数名字替换 DEBUG <--> printf #define DEBUG(format, ...) printf(format, ##__VA_ARGS__) //替换打印函数,在打印出来的内容加上前缀 #define XFUNC_PRINT(format, arg...) printf("XFUNC: " format "", #...
#define DEBUG //#undef DEBUG #define PRINT(format, ...) printf(# format, ##__VA_ARGS__) // 定义一个宏连接两个参数 #define TOGETHER(x , y) x ## y static int DebugPrintf(const char * format, ...); static int DebugPrintf(const char * format, ...) { // 如果定义了插桩调试...
C语言,调试必备的DEBUG宏定义 1. #include <stdio.h>#include<stdarg.h>//仅仅是打印函数名字替换 DEBUG <--> printf#defineDEBUG(format, ...) printf(format, ##__VA_ARGS__)//替换打印函数,在打印出来的内容加上前缀#defineXFUNC_PRINT(format, arg...) printf("XFUNC: " format "", ##arg)/...
__VA_ARGS__(C99提供的可变宏),在上文DLog中也有用到过。 它是可变参数宏,对他进行宏定义可以传入不定个数的参数,在他前面加上##则表示可变参数被忽略或为空时会直接将其带来的负面效果移除,就像__VA_ARGS__完全没有存在一样。 举个例子: #defineDLog(s,...)NSLog(@"<%p %@:(%d)> %@",self,...
在上述代码中,我们定义了一个 DEBUG 宏定义,它用于控制是否编译调试信息。在 main 函数中,我们使用了 #ifdef DEBUG 指令来判断是否定义了 DEBUG 宏定义,如果定义了,则输出调试信息;否则只输出正常信息。宏定义中的多行代码 在宏定义中可以使用 \ 换行符将多行代码合并为一行。例如:在上述代码中,我们定义了...
debug ("A message"); 宏展开后,其中的字符串后面会多个多余的逗号,而"##"则会使预处理器去掉这个多余的逗号。 扩展宏定义中, "#" 和 "##"的含义。 #define INT64CONST(x) (x##L) #define UINT64CONST(x) (x##UL) 1. 2. #define LOCAL_FCINFO(name, nargs) \ ...
根据DEBUG宏的值来选择对应的打印宏函数。当DEBUG的值为1时启动相关的打印调试语句,DEBUG的值为0时则...
这样调试的信息只存在与插桩信息宏DEBUG的预处理指令下,如果需要打开调试信息就定义插桩信息宏DEBUG,否则就将插桩信息宏DEBUG注释掉(也可以undef或者删掉)。 这样我们的代码就变成 /* debug.c */ #include <stdio.h> #include <stdlib.h> /* 插桩信息宏 */ ...
这是C语言的宏定义 if defined(__DEBUG__) 如果定义了宏 __DEBUG__ 可以在编译选项中加这个宏,也可以在调用代码前用#define命令来定义这个宏,也可以不定义 define Msg(msg) printf("%s\n", msg) 如果定义了宏 __DEBUG__,则遇到Msg(msg) 这样的语句,就会替换成printf("%s\n",...
比如,定义一个宏开关: #define __DEBUG 当需要调试的时候,使用语句: #ifdef __DEBUG printf(xxx); #endif 这种方式的调试,可以通过undef __DEBUG的方式让告知编译器不编译这些语句,从而不再输出这些语句。但是这种方式的麻烦之处也是显而易见的,每一条调试语句都需要使用两条宏定义来包围,这不但在代码的编写...