程序员的自我修养 pdf_软件特攻队|C/C++程序员的自我修养(5)
什么是好的程序员?是不是懂得很多技术细节?还是懂底层编程?还是编程速度比较快?我觉得都不是。对于一些技术细节来说和底层的技术,只要看帮助,查资料就能找到,对于速度快,只要编得多也就熟能生巧了。
如果要了解一个程序员,我想首先最想看的就是他的程序代码,程序代码可以看出一个程序员的素质和修养,程序就像一个作品,有素质有修养的程序员的作品必然是一图精美的图画,一首美妙的歌曲,一本赏心悦目的小说。
“细微之处见真功”,真正能体现一个程序的功底恰恰在这些细微之处。
这就是程序员的——编程修养。我总结了在用C/C++语言(主要是C语言)进行程序写作上的三十二个“修养”,通过这些,你可以写出质量高的程序,同时也会让看你程序的人渍渍称道,那些看过你程序的人一定会说:“这个人的编程修养不错”。
21、goto语句的使用
N年前,软件开发的一代宗师——迪杰斯特拉(Dijkstra)说过:“goto statment is harmful !!”,并建议取消goto语句。因为goto语句不利于程序代码的维护性。
这里我也强烈建议不要使用goto语句,除非下面的这种情况:
#define FREE(p) if(p) {
free(p);
p = NULL;
}
main()
{
char *fname=NULL, *lname=NULL, *mname=NULL;
fname = ( char* ) calloc ( 20, sizeof(char) );
if ( fname == NULL ){
goto ErrHandle;
}
lname = ( char* ) calloc ( 20, sizeof(char) );
if ( lname == NULL ){
goto ErrHandle;
}
mname = ( char* ) calloc ( 20, sizeof(char) );
if ( mname == NULL ){
goto ErrHandle;
}
......
ErrHandle:
FREE(fname);
FREE(lname);
FREE(mname);
ReportError(ERR_NO_MEMOEY);
}
也只有在这种情况下,goto语句会让你的程序更易读,更容易维护。(在用嵌C来对数据库设置游标操作时,或是对数据库建立链接时,也会遇到这种结构)
22、宏的使用
很多程序员不知道C中的“宏”到底是什么意思?特别是当宏有参数的时候,经常把宏和函数混淆。我想在这里我还是先讲讲“宏”,宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。这个动作术语叫“宏的展开”
使用宏是比较“危险”的,因为你不知道宏展开后会是什么一个样子。例如下面这个宏:
#define MAX(a, b) a>b?a:b
当我们这样使用宏时,没有什么问题:MAX( num1, num2 ); 因为宏展开后变成 num1>num2?num1:num2;。但是,如果是这样调用的,MAX( 17+32, 25+21 ); 呢,编译时出现错误,原因是,宏展开后变成:17+32>25+21?17+32:25+21,哇,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
#define MAX( (a), (b) ) (a)>(b)?(a):(b)
即使是这样,也不这个宏也还是有Bug,因为如果我这样调用 MAX(i++, j++); , 经过这个宏以后,i和j都被累加了两次,这绝不是我们想要的。
所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个50行的宏,程序中有1000个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。
因此,在决定是用函数,还是用宏时得要小心。
23、static的使用
static关键字,表示了“静态”,一般来说,他会被经常用于变量和函数。一个static的变量,其实就是全局变量,只不过他是有作用域的全局变量。比如一个函数中的static变量:
char*
getConsumerName()
{
static int cnt = 0;
....
cnt++;
....
}
cnt变量的值会跟随着函数的调用次而递增,函数退出后,cnt的值还存在,只是cnt只能在函数中才能被访问。而cnt的内存也只会在函数第一次被调用时才会被分配和初始化,以后每次进入函数,都不为static分配了,而直接使用上一次的值。
对于一些被经常调用的函数内的常量,最好也声明成static(参见第12条)
但static的最多的用处却不在这里,其最大的作用的控制访问,在C中如果一个函数或是一个全局变量被声明为static,那么,这个函数和这个全局变量,将只能在这个C文件中被访问,如果别的C文件中调用这个C文件中的函数,或是使用其中的全局(用extern关键字),将会发生链接时错误。这个特性可以用于数据和程序保密。
24、函数中的代码尺寸
一个函数完成一个具体的功能,一般来说,一个函数中的代码最好不要超过600行左右,越少越好,最好的函数一般在100行以内,300行左右的孙函数就差不多了。有证据表明,一个函数中的代码如果超过500行,就会有和别的函数相同或是相近的代码,也就是说,就可以再写另一个函数。
另外,函数一般是完成一个特定的功能,千万忌讳在一个函数中做许多件不同的事。函数的功能越单一越好,一方面有利于函数的易读性,另一方面更有利于代码的维护和重用,功能越单一表示这个函数就越可能给更多的程序提供服务,也就是说共性就越多。
虽然函数的调用会有一定的开销,但比起软件后期维护来说,增加一些运行时的开销而换来更好的可维护性和代码重用性,是很值得的一件事。
欢迎关注软件特攻队!
程序员的自我修养 pdf_软件特攻队|C/C++程序员的自我修养(5)相关推荐
- const 常量_软件特攻队|const常量,不一样的新玩法
const用于申明变量,放于变量类型之前,表示此变量不可被改变.然而C语言和C++中的const有着不一样的意义.如下所示: const int a = 10; int *p = &a; 上面 ...
- qt 程序异常结束。_软件特攻队|VLC-Qt,功能齐全的跨平台多媒体开发利器
VLC-Qt是一个免费的开源库,结合了 Qt 应用程序和 libVLC库,使他包含了用于媒体播放的核心类,以及用来快速地进行媒体播放器开发的一些 GUI 类. 由于集成了整个libVLC库,使得VLC ...
- linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?
一.前言 为什么说QT越来越成为界面编程的第一选择,这要从当初为什么从MFC转到QT开始说.若想把MFC开发界面想做得好看一些是十分困难的一件事,引用第三方基于MFC的界面库代码也比较混乱,而当时看到 ...
- 中的枚举属性函数_软件特攻队|Qt中的反射机制之Q_PROPERTY
接触过Java的同学肯定知道"反射"这一神器,而所谓的反射,指的是对于任意的一个类,即使在运行状态下,都能知道这个类的所有方法和属性,并可以动态调用这些方法的一种机制. 但是非常遗 ...
- 开启协程_软件特攻队|GCC10发布,GCC 11将支持C++20协程功能?
A coroutine is a function that can suspend execution to be resumed later. 协程是能暂停执行以在之后恢复的函数. 如上所述这是官 ...
- 码农的自我修养之 软件危机和软件过程
码农的自我修养之软件危机和软件过程 软件危机和软件过程 没有银弹 基于组件的软件工程方法 再论没有银弹 基于组件的软件供应链 软件危机的根本问题 软件危机的展望 软件过程模型 软件的生命周期概述 描述 ...
- 软件随想录:程序员部落酋长Joel谈软件(阮一峰译)-3
3. 寻找优秀的程序员之实战指南 2006年9月7日,星期四 你是一个雇主.你在所有正确的地方刊登了招聘广告,你有一个完善的实习生制度,你面试了所有你想要的人.但是很不幸,如果优秀的程序员不愿意为你工 ...
- 程序员必备的20个软件
此文首发于我的个人博客:windows-程序员必备的20个软件 - zhang0peter的个人博客 我自己基本上每半年左右就要重装一次win10系统,所以我在这么多次的重装系统的过程中总结了如下这些 ...
- 软件开发打败了 80 %的程序员
作者 | Ben Hoskin 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 首先,我并不是说软件开发人员都是输家,我想说的是,大多数软件开发人员都没能赢得软件开发,他们都被软件开发打 ...
最新文章
- MySQL语句第二高的薪水查询
- Android Studio导入第三方类库的方法
- java 方法执行结束局部变量释放_JAVA-方法在执行过程中,JVM的内存分配和变化情况,栈(stack)的情况浅析...
- 【kafka】kafka 脚本 kafka-run-class.sh 使用介绍 jmx监控 查看jmx信息
- 外边距的典型应用-让块级盒子水平居中(HTML、CSS)
- 常见排序算法以及对应的时间复杂度和空间复杂度
- IDEA 个人私藏插件
- 装机电脑用什么软件测试,有什么一键装机的软件比较好用?
- tp5 mysql悲观锁_thinkphp悲观锁机制处理高并发
- 还在为日程安排发愁?是因为你没有使用飞项
- 【Linux学习笔记】管理Linux操作系统:软件安装
- Ubuntu22.04安装惠普P1108打印机并在局域网内共享
- 设计模式学习笔记-2 创建者模式-工厂方法模式
- 字符串 转义 反转义
- php 抓取 知乎专栏,php爬取知乎用戶信息
- [生命科学] 生物基础实验之PCR验证
- c2c网站开店的流程图_C2C网店策划书
- 《我们的梦》——我公司形象歌曲
- macromedia_评测-Dreamweaver MX 2004(Macromedia)
- leaflet一键清空所有已绘制的多边形和点位
热门文章
- vue视频保存不下来_视频素材制作小技巧
- python图片保存需要在图片展示后_用python处理图片之打开\显示\保存图像的方法...
- c语言中整型数组如何初始化,C语言数组空间的初始化详解
- ROS入门 Client Library与roscpp
- 轻量化网络:MobileNets
- 【MatConvNet】配置GPU
- [抄]使用网页进行展示而非PPT
- Lucene的索引不跨平台
- hihocoder1241 Best Route in a Grid
- 东大OJ-1544: GG的战争法则