请问在要执行的语句上加do{}while(0),有什么深意?
像这一句,#define SDA_DIR do{P3DIR |= BIT1;P3SEL &= ~BIT1;}while(0)按照C语言的语法理解,加上do{}while(0),跟没加是一样结果,那别人这样写有什么深意呢? 用心良苦,但实际上只需使用一个逗号‘,’即可:
#define SDA_DIR P3DIR |= BIT1, P3SEL &= ~BIT1 本帖最后由 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語言由淺入深,深入淺出,深二淺八啪啪啪”書本裏的死板老舊風格吧。 比较下面这段代码,你就明白了。
#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)
可以避免这个问题。 回复【2楼】tmpond
比较下面这段代码,你就明白了。
#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)
可以避免这个问题。
-----------------------------------------------------------------------
谢谢楼上的,如果不加括号,放在IF语句里肯定是错的,但整体加上大括号{}也会报错吗?我试下 mark 如果只加大括号可能会出错的:
#define BLAH() { blahblah; }
if (cond)
BLAH();// <---- 后面有分号
else
{
SomethingElse();
}
展开后变成:
if (cond)
{ blahblah; };// <----- 注意后面的分号
else
{
SomethingElse();
} 回复【5楼】theophilus
-----------------------------------------------------------------------
完全明白了,谢谢2楼和5楼! 编写规范,增强可读性 终于明白了,多谢~··· 回复【7楼】ManofPhysics
-----------------------------------------------------------------------
看我的头像。。。 回复【9楼】binaimei2007 兵仔
-----------------------------------------------------------------------
回复【7楼】ManofPhysics
-----------------------------------------------------------------------
可以玩找茬了 宏展开的时候会报错,无论加什么括号也都是一样的。
---------------
为什么啊,我加上括号的话,不是if为真的话,执行真个括号内的指令吗 mark 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) mark 回复【13楼】TimCheng
(原文件名:1.jpg)
引用图片
点击此处打开
点击此处打开
-----------------------------------------------------------------------
这个是哪个教程里的?上面几位回答的跟这里几乎一摸一样,看来很多人读个这个教程呀? 学习了。。。 确实是个好办法,还可以消除go to MACK,{:victory:} 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.
xiangxiadage 发表于 2013-8-7 10:43 static/image/common/back.gif
同意这位兄弟
完全正确
上面有些回复误导
楼上的兄弟,以及楼上的兄弟,还是没有理解到。
如果if语句后面还要跟其他语句呢?加大括号行吗?
用do while是把多个语句封装成一个语句 xiangxiadage 发表于 2013-8-7 10:43 static/image/common/back.gif
同意这位兄弟
完全正确
上面有些回复误导
如果只加大括号,在if()define SDA_DIR;else...这种情况下编译报错。//注意定义后面的分号,很多人都会这么写。 收藏一下 我也试试 好,又学了一招,增强程序的移植性 学习………… 边界效应!学习了... crazy_horse 发表于 2013-8-7 10:56 static/image/common/back.gif
如果只加大括号,在if()define SDA_DIR;else...这种情况下编译报错。//注意定义后面的分号,很多人都会这 ...
if(condition)
xxx;
;//把if和else分开了,报错!
else
xxx; 看大湿回复………… 是的 的确这样 学习了。。。。 学习了,要是没想到这点,出错了估计要找很久{:sweat:} TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)
点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...
请问这本书是? 学习了 TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)
点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...
请教下这个是什么文档,能发下学习吗 高人很多啊。 学习了 forum 发表于 2013-9-9 18:10 static/image/common/back.gif
请教下这个是什么文档,能发下学习吗
Linux内核情景分析 王二狗子 发表于 2013-9-9 17:53 static/image/common/back.gif
请问这本书是?
Linux内核情景分析 wuha 发表于 2011-6-10 09:30 static/image/common/back.gif
回复【13楼】TimCheng
(原文件名:1.jpg)
Linux内核情景分析 呵呵。。。。。mark 和高手交流,能提高自己! 貌似学到了什么 以前遇到这样的问题,用define怎么定义都出错,现在看了这个帖子终于明白了。感谢楼主!感谢2楼与5楼!
另外,11楼的头像也挺漂亮的,喜欢! su_mj000 发表于 2013-9-11 03:30 static/image/common/back.gif
用心良苦,但实际上只需使用一个逗号‘,’即可:
#define SDA_DIR P3DIR |= BIT1, P3SEL &= ~BIT1 ...
我未試,但表同。 二楼和五楼果然强大。 mark{:smile:} 太牛了,以前都没想到这种解决方法,赶紧回去修代码。。。 3L 正解 好帖,Mark 学习了,原来还可以这样!!! TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)
点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...
哇,学到东西了,哈哈 TimCheng 发表于 2011-6-9 15:46 static/image/common/back.gif
(原文件名:1.jpg)
点击此处打开 ourdev_647238G1P0IY.jpg(文件大小:1.47M,只有400K以内的图片才能直接 ...
感谢!!
#define SDA_DIR P3DIR |= BIT1;P3SEL &= ~BIT1
if(condition)
{ SDA_DIR ;
}
else
{ .......
}
这样写吧!
规范里不是要求:每个ifelse 即使一条语句也要加括号的吗? 学过了,谢谢! 在哪学的?绕来绕去的。我觉得没意义。
即使是分号,我也加。
if(a==1)
{;
}
else
{...
} #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.
学习了 学习了、标记。 tmpond 发表于 2010-12-3 12:02
比较下面这段代码,你就明白了。
#define SDA_DIR P3DIR |= BIT1;P3SEL &= ~BIT1
学习了,没有注意到的细节 tmpond 发表于 2010-12-3 12:02
比较下面这段代码,你就明白了。
#define SDA_DIR P3DIR |= BIT1;P3SEL &= ~BIT1
Good !
页:
[1]