您的位置:首页 > 其它

关于宏中使用do{}while(0)的作用

2017-12-02 14:44 155 查看
关于do{}while(0),大家肯定不会陌生,就是do 里面的循环体执行一次,且仅执行一次。那这样和普通的语句有什么区别呢?在宏中,这样做是为了保证宏的正确执行(行为一致),就跟if(n ==0 ) ,大家会写成if(0 == n) 一样。一下是一个例子,便于理解。

#include "stdio.h"

#define DIVISION(X,Y) add((X) , (Y));\
div((X), (Y))

int add(int x, int y)
{
printf("add");
}
int div(int x, int y)
{
printf("div");
}
int main(int argc, _TCHAR* argv[])
{
bool flag = true;
if (!flag) DIVISION(6, 2);
getchar();
return 0;
}


看着个例子,!flag为NULL,DIVISION的宏中的add(),div()是不应该被执行的。但实际的结果确是


那么为什么会出现这种现象呢?当我们按照宏进行替换时,代码就会变成这样

if(!flag) add(6,2);div(6,2);
编译器便会认为成这样:

if(!flag)
add(6,2);
div(6,2);


所以便会出现非预期现象。所以为了保证宏在任何情况下的一致性,则需加上do{}while(0)语句。

#define DIVISION(X,Y) \
do{\
add((X),(Y));\
div((X),(Y));\
}\
while(0)


这样就不会出现这种问题了。这种用法大量见于宏定义中含有的多行语句的时候。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: