条件编译debug与可变参数宏

 用代码就能说明问题吧

 

#include <stdio.h> /* LOG1是比较流行的处理“可变参数宏”的方法,注意的是使用的时候需要额外再加一层括号, * 这样args在展开的时候就会始终带有一层括号 */ #ifndef DEBUG #define LOG1(args) printf args #else #define LOG1(args) ((void) 0) #endif //LOG2是错误的,因为“可变参数宏”的参数个数不是1个 #ifndef DEBUG #define LOG2(args) printf(args) #else #define LOG2(args) ;、 #endif //LOG3需要C99的支持,可以正式支持“可变参数宏” #ifndef DEBUG #define LOG3(...) printf(__VA_ARGS__) #else #define LOG3(args) ; #endif //LOG4也是错误的,原因与LOG2完全相同,网上有很多这个例子,其实是不对的,正确是应该是LOG5的形式 #ifndef DEBUG #define LOG4(args) (printf("DEBUG: "), printf(args)) #else #define LOG4(args) ; #endif /* LOG5是正确的,相对于LOG4而言,它正确的原因是因为,带参数宏定义其中参数表中的参数之间是用“逗号”分隔的, * “逗号”在带参数宏定义是起到区分参数个数的作用的。 */ #ifndef DEBUG #define LOG5(args) (printf("DEBUG: "), printf(args)) #define _ , #else #define LOG5(args) ; #endif //测试是否用#endif来结束#ifdef #ifndef DEBUG #define STR "mystr/n" #endif /******************************** * 解释LOG1(args)的打印 * 当碰到"LOG((123))"的时候,宏展开如下:"(123)"即为可变参数args,而"LOG加上最外面的括号"即为"printf" * 所以最后的结果为printf ("123"),注意中间有个空格,这样的打印语句也是可以的 * 再比如ADD(a,b) a+b,展开的时候x=ADD(a,b),就是x=a+b * */ int main() { int a = 1; int b = 2; printf("测试LOG1--------------/n"); LOG1(("a=%d,b=%d/n",a,b)); LOG1(("123/n")); printf ("printf之前有多个空格,仍然可以打印!/n"); printf("/n/n测试LOG2---------------/n"); LOG2("Love my,love my dog!/n"); LOG2("a=%d/n",a);//不等价于printf("a=%d/n",a),因为宏定义里面只有一个参数,而这里面有两个参数,用“,”隔开 printf("a=%d/n",a); //运行时会报内存错误,因为printf(()),第一个参数微const char *, //而不是int,表示式("a=%d/n",a)是逗号表达式,而逗号表达式的结果为逗号右边的值 // LOG2(("a=%d/n",a)); LOG2(STR); printf("/n/n测试LOG3---------------/n"); LOG3("b=%d/n",b); LOG3("a=%d,b=%d/n",a,b); printf("/n/n测试LOG4---------------/n"); LOG4("a=%d,b=%d/n",a,b); printf("/n/n测试LOG5---------------/n"); LOG5("a=%d/n" _ a);//这里注意空格,因为_a连在一起就变成变量_a了(变量可以用“_”开头) return 0; }  

 

后面是打印结果

条件编译debug与可变参数宏_第1张图片

你可能感兴趣的:(条件编译debug与可变参数宏)