| 域名空间 下载中心 社区论坛 信息公告 MY小屋 |
![]() |
联系我们 设为首页 加入收藏 |
|
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿 论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图 专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版 社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务 |
| 新版上线![旧版] | |||||
注:打开慢时请稍等
C++程序设计最佳实践http://www.iyit.net 日期:2006-10-12 17:15:47 来源: 点击: |
1、Prefer const and inline to #define 在C++编程中应该尽量使用const和inline来代替#define,尽量做到能不用#define就不用。#define常见的用途有“定义常量”以及“定义宏”,但其中存在诸多的弊病。 第一,查错不直观,不利于调试。Define的定义是由预处理程序处理的,作的是完全的文本替换,不做任何的类型检查。在编译器处理阶段,define定义的东西已经被完全替换了,这样在debug的时候就看不到任何的相关信息,即跟踪时不能step into宏。例如,把ASPECT_RATIO用define定义成1.653,编译器就看不到ASPECT_RATIO这个名字了。如果编译器报1.653错,那么就无从知道此1.653来自于何处。在真正编码的时候应该使用如下的语句来定义:
第二,没有任何类型信息,不是type safe。因为它是文本级别的替换,这样不利于程序的维护。 第三,define的使用很容易造成污染。比如,如果有两个头文件都定义了ASPECT_RATIO, 而一个CPP文件又同时包含了这两个头文件,那么就会造成冲突。更难查的是另外一种错误,比如有如下的代码:
在.h文件中Orange被定义成水果的一种,而在.cpp文件中Orange又成为了一种颜色,那么编译器就会把此处的Orange替换成2,编译可能仍然可以通过,程序也能够运行,但是这就成了一个bug,表现出古怪的错误,且很难查错。再比如定义了一个求a与b哪个数大的宏,#define max(a,b) ((a) > (b) ? (a) : (b))
在上面的操作中,max(++ a, b); 语句中a被++了两次,而max(++ a, b + 10); 语句中a只加了一次,这样在程序处理中就很有可能成为一个bug,且此bug也非常的难找。在实际编码时可以使用如下的语句来做:
2、Prefer C++-style casts 在程序中经常会需要把一种类型转换成另外一种类型,在C++中应该使用static_cast、const_cast、dynamic_cast、reinterpret_cast关键字来做类型转换。因为这有以下好处,一是其本身就是一种注释,在代码中看到上面这些关键字就可马上知道此处是进行类型转换。二是C语言中类型转换通常是很难进行搜索的,而通过关键字cast则可以很容易的找到程序中出现类型转换的地方了。 3、Distinguish between prefix and postfix forms of increment and decrement operators 通常对于操作系统或编译器自身支持的类型,prefix(前缀,如++i)与postfix(后缀,如i++)的效果是一样的。因为现在的编译器都很聪明,它会自动做优化,这两者的汇编代码是一样的,性能不会有差别。但有时候也会有不同的,如一些重载了操作符的类型。下面是模拟prefix与postfix的操作过程,可以发现在postfix操作中会生成一个临时变量,而这一临时变量是会占用额外的时间和开销的。
本新闻共2页,当前在第1页 1 2 编辑: [发送给好友] [打印本页] [关闭窗口] [返回顶部] 上一篇:VC++ SMTP协议电子邮件传送剖析 下一篇:写好C程序的秘籍(强!) 转载请注明来源:www.iyit.net 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
| 相关文章 | ||||
| 设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接 |
| |||||||