do{ }while(0)在内核中的应用

在内核中我们经常看到宏定义中使用do{ }while(0)这种定义,会不会感觉很奇怪,这也只会执行一次,为什么要这样做那?
这里我随便写一个宏

#define MUL_ADD(num) do{ num *= num; ++num }while(0)
如果不加do{ }while(0)就是这样的
#define MUL_ADD(num) num *= num; ++num

那么当我们遇到这种情况的时候

if(res  > 0)
    MUL_ADD(res);
else
    res = 0;

我们知道宏在预编译的时候,实际上就是一种替换
那么替换后就变成了

if(res  > 0)
    num *= num; 
    ++num;
else
    res = 0;

如果不加do{ }while(0)就会导致错误。

其实在我们写代码的时候不要图省事去减少一些必要的括号,记得在《c的代码与缺陷》看到这样一个例子

if(res > 0if(count < 0)
        ...
else
    ....

他的本意是当res > 0的时候去判断count是否<0, 如果res <= 0,做其他处理.但是结果却成了当res > 0的时候去判断count是否<0, 如果count <= 0,做其他处理。归根到底这些小的错误都是源于偷懒所以我建议判断语句和循环语句该加括号的地方,即使只有一条语句也要去加,这样可以减少不必要的错误。

猜你喜欢

转载自blog.csdn.net/bin_zhang1/article/details/80938119