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

来源:互联网 发布:大庆58同城网络交易 编辑:程序博客网 时间:2024/06/05 00:19

关于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)

这样就不会出现这种问题了。这种用法大量见于宏定义中含有的多行语句的时候。

原创粉丝点击