您的位置:首页 > 其它

条件编译debug与可变参数宏

2009-11-26 20:44 288 查看
 用代码就能说明问题吧

 

#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;
}

 

 

后面是打印结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  测试 c
相关文章推荐