条件编译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; }
后面是打印结果
相关文章推荐
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
- FB AS3 中,使用条件编译,实现debug、release的代码分离编译。
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- WP工程设置DEBUG 条件编译
- .net DEBUG 条件编译语句
- qt条件编译debug和release版本--qmake之CONFIG(debug, debug|release)
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- Java方法传参和可变参数的个别说明,以及foreach的语法和编译后的实现
- Day 07 debug调试 junit单元测试 jdk5.0新特性 泛型,枚举,静态导入,拆装箱,增强for,可变参数 反射
- VS.Net项目的条件编译常数“DEBUG”、“TRACE”必须大写才起作用。
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- 从Trace和Debug来看条件编译(Conditional Compilation)
- 参数的传递方式、变量的作用域、变量的生存期、内部函数和外部函数、编译预处理命令、条件编译
- JAVA基础学习之IP简述使用、反射、正则表达式操作、网络爬虫、可变参数、了解和入门注解的应用、使用Eclipse的Debug功能(7)
- GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)
- Lua编程示例(一):select、debug、可变参数、table操作、error
- QT工程文件的条件编译选择与额外的编译参数配置
- QT工程文件的条件编译选择与额外的编译参数配置