听说复杂宏的编写方式有两种,一种是用do...while(0),一种是语句表达式。内核源代码中顶喜欢他们俩,不可不认识哟!
拓展:
第一,do...while(0)形式实现复杂宏,请看:
do...while(0)确保了整个复合语句只被执行一遍,注意到最后的while(0)后面是不带分号的,因为一般我们在调用一个宏的时候会带上分号,比如上述的宏:
SEARCH(i, some_array, m);
第二种编写复杂宏的方式是语句表达式,例如我们可以将上述代码改成:
这两种形式的区别是,复合语句表达式可以作为右值,给另一个变量赋值。而do...while(0)不可以。