|
关于这段代码学习两个技巧:
1.do{ func1_call();func2_call(); }while(0);
好处:
- #define do_nothing() do {} while(0)
这是个空操作,并且这样编译时不会出现警告。
- 1*中的{}可以组成一个代码块:{}中可以新建变量,实现复杂算法。
由于使用宏就如同使用函数一般,必须在最后添加一个“;”,即像如下的方法使用:
pr_debug(“error: write a file.”); 这样宏定义中只能用do{} while(0),而不能直接使用{}来构成一个代码块。
2.({if (0) func_call(); 0; })
- 直接改成({ 0; })可不可以。
不可以。因为这样编译时会有警告:变量未使用。
- “0;”语句是做什么用的呢。
为了使这个代码段的返回值为0.
注意:#define swap(a, b) {int tmp; tmp = b; b = a; a = tmp;}
c=wap(a,b);是没有返回值的,c=0;
而:#define swap(a, b) ({int tmp; tmp = b; b = a; a = tmp;})
则c=wap(a,b);是有返回值的,就是{}中最后语句的值,c=a;