wuha 发表于 2010-12-3 09:49:20

请问在要执行的语句上加do{}while(0),有什么深意?

像这一句,#define SDA_DIR   do{P3DIR |= BIT1;P3SEL &= ~BIT1;}while(0)
按照C语言的语法理解,加上do{}while(0),跟没加是一样结果,那别人这样写有什么深意呢?

su_mj000 发表于 2013-9-11 03:30:33

用心良苦,但实际上只需使用一个逗号‘,’即可:

#define SDA_DIR   P3DIR |= BIT1, P3SEL &= ~BIT1

qlb1234 发表于 2013-9-11 09:25:37

本帖最后由 qlb1234 于 2013-9-11 09:31 编辑

好吧,無聊人來也。#include <cstdio>

int main()
{
#define GOGOGO a=1,b=2
    unsigned int a, b, c = 1;
    if(c == 1)
      GOGOGO;
    else
    {
      a = 3;
      b = 3;
    }
    printf("%u %u", a, b);
    return 0;
}GCC g++ 4.8.1,無任何錯誤提示,輸出1 2其實,在每箇if、else、else if、while、for後,加上一箇大括號對,是一箇良好習慣,哪怕你的代碼衹有一行。

我的習慣是#include <cstdio>

int main()
{
#define GOGOGO a=1;b=2
    unsigned int a, b, c = 1;
    if(c == 1)
    {
      GOGOGO;
    }
    else
    {
      a = 3;
      b = 3;
    }
    printf("%u %u", a, b);
    return 0;
}同樣無錯誤,正常結果。
少年們,拋掉大學課堂上、各種“C語言由淺入深,深入淺出,深二淺八啪啪啪”書本裏的死板老舊風格吧。

tmpond 发表于 2010-12-3 12:02:41

比较下面这段代码,你就明白了。

#define SDA_DIR   P3DIR |= BIT1;P3SEL &= ~BIT1

if(condition)
      SDA_DIR;
else
      ......
相当于
if(condition)
      P3DIR |= BIT1;P3SEL &= ~BIT1;
else
      ......

宏展开的时候会报错,无论加什么括号也都是一样的。


而定义成
#define SDA_DIR   do{P3DIR |= BIT1;P3SEL &= ~BIT1;}while(0)
可以避免这个问题。

wuha 发表于 2010-12-3 12:07:25

回复【2楼】tmpond
比较下面这段代码,你就明白了。
#define sda_dir   p3dir |= bit1;p3sel &amp;= ~bit1
if(condition)
      sda_dir;
else
      ......
相当于
if(condition)
      p3dir |= bit1;p3sel &amp;= ~bit1;
else
      ......
宏展开的时候会报错,无论加什么括号也都是一样的。
而定义成
#define sda_dir   do{p3dir |= bit1;p3sel &amp;= ~bit1;}while(0)
可以避免这个问题。

-----------------------------------------------------------------------

谢谢楼上的,如果不加括号,放在IF语句里肯定是错的,但整体加上大括号{}也会报错吗?我试下

lsy5110 发表于 2010-12-3 12:28:00

mark

theophilus 发表于 2010-12-3 12:43:36

如果只加大括号可能会出错的:

#define BLAH() { blahblah; }

if (cond)
    BLAH();// <---- 后面有分号
else
{
    SomethingElse();
}

展开后变成:
if (cond)
{ blahblah; };// <----- 注意后面的分号
else
{
    SomethingElse();
}

wuha 发表于 2010-12-3 12:49:19

回复【5楼】theophilus
-----------------------------------------------------------------------

完全明白了,谢谢2楼和5楼!

ManofPhysics 发表于 2010-12-3 12:55:19

编写规范,增强可读性

dzyong 发表于 2010-12-4 21:26:37

终于明白了,多谢~···

binaimei2007 发表于 2010-12-4 21:42:53

回复【7楼】ManofPhysics
-----------------------------------------------------------------------
看我的头像。。。

win100 发表于 2010-12-4 22:28:14

回复【9楼】binaimei2007 兵仔
-----------------------------------------------------------------------
回复【7楼】ManofPhysics
-----------------------------------------------------------------------
可以玩找茬了

tiaomiaodu 发表于 2010-12-6 01:05:46

宏展开的时候会报错,无论加什么括号也都是一样的。
---------------
为什么啊,我加上括号的话,不是if为真的话,执行真个括号内的指令吗

ccmj4708 发表于 2011-6-9 15:30:56

mark

TimCheng 发表于 2011-6-9 15:46:07

http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_647237EK867D.jpg
(原文件名:1.jpg)

点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接显示) (原文件名:2.jpg)
点击此处打开 ourdev_647239AMQPV4.jpg(文件大小:1.48M,只有400K以内的图片才能直接显示) (原文件名:3.jpg)

llyuli 发表于 2011-6-9 15:48:36

mark

wuha 发表于 2011-6-10 09:30:00

回复【13楼】TimCheng

(原文件名:1.jpg)
引用图片
点击此处打开
点击此处打开

-----------------------------------------------------------------------

这个是哪个教程里的?上面几位回答的跟这里几乎一摸一样,看来很多人读个这个教程呀?

lang1437 发表于 2011-6-10 10:17:14

学习了。。。

dongfo 发表于 2013-7-22 14:03:46

确实是个好办法,还可以消除go to

wangsage 发表于 2013-8-7 09:28:20

MACK,{:victory:}

xiangxiadage 发表于 2013-8-7 10:43:59

cbing2000 发表于 2013-8-7 09:47 static/image/common/back.gif
你宏定义 用{ } 就不会了。   #define SDA_DIR   {P3DIR |= BIT1;P3SEL &= ~BIT1;}

同意这位兄弟
完全正确
上面有些回复误导

{}后面有;分号肯定可以
ISO 9899写得很清楚:
A null statement (consisting of just a semicolon) performs no operations.

zf12862177 发表于 2013-8-7 10:47:50

xiangxiadage 发表于 2013-8-7 10:43 static/image/common/back.gif
同意这位兄弟
完全正确
上面有些回复误导


楼上的兄弟,以及楼上的兄弟,还是没有理解到。

如果if语句后面还要跟其他语句呢?加大括号行吗?

用do while是把多个语句封装成一个语句

crazy_horse 发表于 2013-8-7 10:56:20

xiangxiadage 发表于 2013-8-7 10:43 static/image/common/back.gif
同意这位兄弟
完全正确
上面有些回复误导


如果只加大括号,在if()define SDA_DIR;else...这种情况下编译报错。//注意定义后面的分号,很多人都会这么写。

alextime 发表于 2013-9-1 20:35:35

收藏一下 我也试试

qq1136029879 发表于 2013-9-3 15:16:32

好,又学了一招,增强程序的移植性

ab1212144 发表于 2013-9-5 22:50:37

学习…………

yixuantaba 发表于 2013-9-6 16:52:45

边界效应!学习了...

wxty 发表于 2013-9-6 17:09:46

crazy_horse 发表于 2013-8-7 10:56 static/image/common/back.gif
如果只加大括号,在if()define SDA_DIR;else...这种情况下编译报错。//注意定义后面的分号,很多人都会这 ...

if(condition)
    xxx;
    ;//把if和else分开了,报错!
else
    xxx;

ab1212144 发表于 2013-9-7 23:11:22

看大湿回复…………

3050311118 发表于 2013-9-8 08:57:12

是的 的确这样

LingYi 发表于 2013-9-8 09:10:25

学习了。。。。

zhutao7589 发表于 2013-9-8 10:29:18

学习了,要是没想到这点,出错了估计要找很久{:sweat:}

王二狗子 发表于 2013-9-9 17:53:21

TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)

点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...

请问这本书是?

943941946 发表于 2013-9-9 18:10:25

学习了

forum 发表于 2013-9-9 18:10:40

TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)

点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...

请教下这个是什么文档,能发下学习吗

divineliu 发表于 2013-9-9 18:18:31

高人很多啊。

leijiayou 发表于 2013-9-9 18:21:01

学习了      

TimCheng 发表于 2013-9-10 08:17:21

forum 发表于 2013-9-9 18:10 static/image/common/back.gif
请教下这个是什么文档,能发下学习吗

Linux内核情景分析

TimCheng 发表于 2013-9-10 08:17:37

王二狗子 发表于 2013-9-9 17:53 static/image/common/back.gif
请问这本书是?

Linux内核情景分析

TimCheng 发表于 2013-9-10 08:18:21

wuha 发表于 2011-6-10 09:30 static/image/common/back.gif
回复【13楼】TimCheng

(原文件名:1.jpg)


Linux内核情景分析

luobote55 发表于 2013-9-10 08:26:32

呵呵。。。。。mark

guowanling8061 发表于 2013-9-10 08:32:50

和高手交流,能提高自己!

神秘的小五君 发表于 2013-9-10 22:42:54

貌似学到了什么

littlemouse11 发表于 2013-9-11 01:34:32

以前遇到这样的问题,用define怎么定义都出错,现在看了这个帖子终于明白了。感谢楼主!感谢2楼与5楼!
另外,11楼的头像也挺漂亮的,喜欢!

qlb1234 发表于 2013-9-11 07:28:12

su_mj000 发表于 2013-9-11 03:30 static/image/common/back.gif
用心良苦,但实际上只需使用一个逗号‘,’即可:

#define SDA_DIR   P3DIR |= BIT1, P3SEL &= ~BIT1 ...

我未試,但表同。

kelp 发表于 2013-9-11 09:49:14

二楼和五楼果然强大。

jianplx 发表于 2013-9-11 12:53:55

mark{:smile:}

CopeHuang 发表于 2013-9-17 09:29:23

太牛了,以前都没想到这种解决方法,赶紧回去修代码。。。

nome 发表于 2013-9-17 09:38:11

3L 正解         

Codoox 发表于 2013-9-18 10:03:17

好帖,Mark                        

gaolongtou 发表于 2013-9-19 08:57:31

学习了,原来还可以这样!!!

baojiaqi 发表于 2013-9-19 18:30:37

TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)

点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...

哇,学到东西了,哈哈

baojiaqi 发表于 2013-9-19 18:31:53

TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)

点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...

感谢!!

菜鸟很热心 发表于 2013-9-29 10:34:11

#define SDA_DIR   P3DIR |= BIT1;P3SEL &= ~BIT1

if(condition)
{    SDA_DIR ;
}
else
{    .......
}

这样写吧!
规范里不是要求:每个ifelse 即使一条语句也要加括号的吗?

滴答滴答下雨啦 发表于 2013-10-3 17:12:46

学过了,谢谢!

zhwm3064 发表于 2013-10-3 20:28:32

在哪学的?绕来绕去的。我觉得没意义。
即使是分号,我也加。
if(a==1)
{;
}
else
{...
}

millwood0 发表于 2013-10-3 20:48:06

#define SDA_DIR   P3DIR |= BIT1;P3SEL &= ~BIT1

if(condition)
{    SDA_DIR ;
}What if some time in the future a dumbass comes around and changes the code to this, without seeing how SDA_DIR is defined:
if(condition)
    SDA_DIR ;
Looks perfectly innocent.

Your code is not robust and it is a time bomb waiting for its next victim. Something like this is easy to debug in a small system but in a large system, it is difficult to identify.

我是谁712 发表于 2013-10-4 11:53:35

学习了                                             

长夜伴灯 发表于 2016-7-28 11:25:49

学习了、标记。

klxx68 发表于 2016-7-28 12:25:18

tmpond 发表于 2010-12-3 12:02
比较下面这段代码,你就明白了。

#define SDA_DIR   P3DIR |= BIT1;P3SEL &= ~BIT1


学习了,没有注意到的细节

sunliezhi 发表于 2016-7-28 19:46:56

tmpond 发表于 2010-12-3 12:02
比较下面这段代码,你就明白了。

#define SDA_DIR   P3DIR |= BIT1;P3SEL &= ~BIT1


Good !         
页: [1]
查看完整版本: 请问在要执行的语句上加do{}while(0),有什么深意?