一、C语言中宏定义(#define)时do{}while(0)的价值
初看这句话,这难道不是废话?然而是不是废话还有待商讨,毕竟内核里都有这句话的身影,你说该不该停下来思考一哈为什么要使用这句看起来像废话的东东。
//使用它的理由 我归结为三点(甚至你可以思考一下是不是有很多废话代码都有着这样美妙的优点)
1. 增加代码的适应性(关键)
@你想表达的意思是不变的(此处的宏定义就是为了替换文中原有语句),但是如何才能在不同环境下都能正确的表达出这个意思(因为使用环境是复杂的),这时这行精简的代码会提高你程序的适应性(健壮性)。
1》单独调用没毛病:
#define FOO(x) | foo(x); bar(x); |
例如:
FOO(100)
宏扩展后变成:
foo(x);bar(x);
2》但是你要把这行代码放到一些别的地方就问题大了
例如:
// 把他放在控制语句里
if (condition)
FOO(x);
else
...;
//就会变成:
if (condition)
foo(x);
bar(x);
else
...;
-_-这个错误十分致命,因为编译器发现不了(他是个逻辑错误。只能肉眼扫描)
//也许你会想到这样的宏定义
#define FOO(x) { foo(x); bar(x); }
//但是,请看下面:
if(condition)
{foo(x);bar(x);} ;//花括号后面出现一个分号 -_-
//那该怎么办?这个时候do{}while(0)的价值就出现了
#define FOO(x) do { foo(x); bar(x); } while(0)
if (condition)
do {
foo(x); bar(x);
} while(0)
else
...;
2.增加代码的扩展性
@宏定义还可以引用别的宏
#define FOO(x) do{
OTHER_FOO(x)
} while(0)
这样因为这行代码有适应性,所以,不管 OTHER_FOO(x)这是个单句的 宏定义,还是多个句子的宏定义,都能正常表达出该有的 意思。
3.增加代码的灵活性
@如果在 do { foo(x); bar(x); } while(0)中加一个if条件语句是不是就更加灵活了
#defineFOO(x) do{ \
foo(x); \
if(condition(x)) \
break; \
bar(x) \
..... \
} while(0)
如果你想知道为什么要加反斜杠和其他宏定义的知识,搜索
linux内核分析及编程 1.3内核通用链表 二:C语言宏定义的小知识