免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: converse
打印 上一主题 下一主题

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧! [复制链接]

论坛徽章:
0
1 [报告]
发表于 2004-07-22 11:07 |显示全部楼层

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

在调试或者测试程序的时候,如果不是普通的注释,而是注释掉代码,我同意 我不懂C++  的观点。由于/**/注释有很大的局限性,即不能嵌套/**/,基本上我不会用它,只用 // 和 #if。

如果是一般性的注释,用 /**/ 或者 //,不宜使用 #if。

论坛徽章:
0
2 [报告]
发表于 2004-09-14 13:36 |显示全部楼层

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

原帖由 "loef" 发表:

[quote]原帖由 "flw" 发表:

而且在宏里使用的do {}while(0)技巧同样值得注意,比如说我们定义了一个宏如下:

#define swap(x,y) {int temp = x; x = y; y = temp;}

可是在用到这个宏的时候,我们经常这么用

swap(x,y);

,注意后面的;号,在把宏展开的时候就会出问题,可是如果我们这么写,就可以避免这个问题了:

#define swap(x,y) \
do {int temp = x; x = y; y = temp;} while(0)


很精辟得用法,避免了语法错误。经典![/quote]

其实 flw 和 loef 说的是不正确的。

swap(x,y); 用第一个宏定义展开后是 {int temp = x; x = y; y = temp;}; ,这个语句最后面的 ; 不会引起错误,因为在这里它是空语句。swap(x, y); 以及 swap(x, y) 的使用形式都是可以的,后者这种使用形式有可能使 swap(x, y) 作为操作数参与表达式的运算(当然这里是不允许的,因为 {} 的存在。如果是这种形式:#define SUM(x, y) ((x) + (y)) 就可以作为操作数使用了)。

由于第二种形式的宏定义是用 do while 语句来实现的,所以它只能这样使用:swap(x, y);,不能这样使用 swap(x, y),即必须在宏调用的后面加一个 ; 才行,这是由 do while 语句的语法决定的。可见,这样做禁止了 swap(x, y) 的使用。

那么这样做的目的何在?上面已经提到过了:它是依靠 do while 的语法规定保证了宏的使用形式是 swap(x, y);,不能是 swap(x, y),从而从语法上制约了这个宏不能作为操作数来使用,就象是返回值类型为 void 的函数一样。

当然,实现这一目的还可以使用 do while 之外其它手段,如第一种宏定义形式中 {} 的使用,使它实际上也不能作为操作数来使用。

论坛徽章:
0
3 [报告]
发表于 2004-09-14 14:40 |显示全部楼层

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

我没考虑到 converse 说的这种情况。从这个意义上讲,flw 和 loef 是正确的。

这也可以看做是 converse 以前贴的一个帖子“MISRA--作为工业标准的C编程规范 ”:http://bbs.chinaunix.net/forum/viewtopic.php?t=399292中“Rule 59. if, else if, else, while, do..while, for语句块必须使用{}括起。”的一个注脚吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP