宏定义中do while的妙用

//宏定义中 do-while 的妙用
//这个程序是为了说明在宏定义是使用do while的作用。

#include
#define IF_A if (N == 0)
printf(“IF_A:tN等于0n”)

#define IF_Do_While do {
if (N == 0)
printf(“IF_Do_While:tN等于0n”);
} while (0)

int main(int argc, char **argv)
{
int N;
printf(“Please input N:t”);
scanf(“%d”, &N);
printf(“——————–n”);
if (N >= 0)
IF_A;
else
printf(“Else:tN小于0n”);

printf(“——————–n”);
if (N >= 0)
IF_Do_While;
else
printf(“Else:tN小于0n”);
printf(“——————–n”);
return 0;
}

编译程序时,对于”else”编译器会寻找前面最近的(还没有与其他else匹配的)if关键字进行匹配, do while语句的巧妙使用则解决了错误匹配带来的问题。如N=3时,上边代码第一个宏就会出错。

补充:

do{..}while(0) 只是为了更容易地把多个语句集合到这个宏定义中,让这个宏看起来更像一个函数。

宏中用到if()时就可能会出问题,比如:

#define FOOBAR() foo(); bar()
if (!something)
FOOBAR();

如果something为假,是只执行foo();

用{}把所有语句括起来也可以,但使用FOOBAR()时不能带分号,这可不像函数。{}是gcc的一个扩展,并不是标准的。
而且编译器会自动优化,不会影响执行速度。

6 thoughts on “宏定义中do while的妙用

  1. 一个简单的例子,对上面“补充”的驳斥和对“摸电”的支持

    #include

    #define PRINT printf(“hellon”); printf(“worldn”);

    void main()
    {
    int i = 0;
    if(!i)
    PRINT
    getch();
    return;
    }

    运行结果:
    hello
    world

    程序在windows + DEV-C++ 环境下编译运行

    个人感觉:

    #define FOOBAR() foo(); bar()
    if (!something)
    FOOBAR();
    如果something为假,是只执行foo();

    应该改成:如果不用大括号括起来,就会在引用时出现一些语法错误,例如下面的代码:
    #define FOOBAR() foo(); bar()
    if (!something)
    FOOBAR();
    else
    return;

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.