做到这些细节,就是高质量C代码!

刘先进
原创 1646       2019-05-20  

 

网传,C语言就像是至尊魔戒,所有人都知道它的力量,每个人都想获得它的力量,它是编程语言的通用语,也是世界上最古老、应用最广泛的语言之一。


而C++则是指环王中的萨茹曼,每一个人都认为他是好人,但你一旦了解他,你会意识到他只想要力量,而非善行。是C语言的难度5星的高复杂版本,自带大神光环。



那么问题来了,如何才能利用魔戒的威力,在获取力量的道路上一往无前,成为一位德高望重的大神?


C/C++码农的日常三问:


什么是高质量的C/C++代码?

C/C++码农中高手和菜鸟的差别在哪里?

在追寻成为大神的道路上,我们是否可以有他山之石?

 

C/C++代码质量的定义也许每个码农,每个项目组,每个部门,每个公司都有着不同的规格定义,乃至会形成不同标准的规范文档。不过最终应该逃不掉功能正确健壮可靠,性能安全易用高效这几个特性的。大神与菜鸟代码的差异也在这些特性中得以体现出来,能长期稳定地码出高质量代码的程序员就是我们定义的大神。

 

高质量的C/C++代码需要良好得编程规范,其生成的代码不仅要容易阅读理解,而且要易于调试测试。下面从排版,注释,命名,可读性等方面举例说明下高质量C/C++代码的编码规范。


1 排版

不允许把多个短语句写在一行中,即一行只写一条语句。菜鸟与大神的区别:


 

2 注释

文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、修改日志等。

/*****************************************************************************

 

Copyright: 1995-2019, Hundsun Technologies Inc.

 

File name: 文件名

 

Description: 用于详细说明此程序文件完成的主要功能,与其他模块或函数的接口,输出值、取值范围、含义及参数间的控制、顺序、独立或依赖等关系

 

Author: 作者

 

Version: 版本

 

Date: 完成日期

 

History: 修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。

 

*****************************************************************************/

 

注释应考虑程序易读及外观排版的因素,出于对维护人员的考虑,建议使用中文。

 


3 标识符命名

命名规范必须与所使用的系统风格保持一致,并在同一项目中统一,比如采用UNIX的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式,用作特殊标识如标识成员变量或全局变量的m_g_,其后加上大小写混排的方式是允许的。

菜鸟与大神的区别:


 

4 可读性

不要使用难懂的技巧性很高的语句,除非很有必要时。高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。示例:


 

5 函数

功能:一个函数仅完成一件功能,不要设计多用途面面俱到的函数。多功能集于一身的函数,很可能使函数的理解、测试、维护等变得困难。

分支:函数分支要健全,if语句必须加上else分支, switch语句必须有default分支。

异常:函数出错处理尽可能完善,返回值要准确明了,报错信息尽可能详细。

 

效率

在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。

 

大神可以码出高质量的代码,但现代社会中人们关注的已经不仅仅只是代码的质量了,而是讲究性价比了。什么是高性价比的代码呢?那就是在提高代码质量的同时并降低生产代码的成本。这就要求菜鸟也可以蜕变成为大神,码出大神级的代码,从而实现鱼与熊掌可以得兼的目标。那菜鸟应该做些什么才可以码出媲美大神级的代码呢?按照大神的标准,勤学苦练多积累是肯定没错的,但我给另外一个终南捷径就是:学会使用工具。

 

传说中远古的大神是这样工作的:操作系统坏了,需要重新编写,把电话线插入网卡,进入DOS模式不停地按着 0、1按键。


2个小时之后……操作系统写好了!



现代的大神们估计很难达到这个高度了,且现在程序员需求高,为保证平均效率,使用工具成为日常的必须。这也就促进来各大工具的多样化发展,只依靠大脑与双手裸奔的远古大神时代终结,开启了标准程序库与IDE开发工具的黄金时代。



深度进阶——码农的黄金时代

标准程序库和集成开发工具(IDE)(代码编辑器 编译器 连接器 解释器 调试器 图形用户界面)的使用是码农进入黄金时代的标志,意义相当于人类学会了钻木取火。标准程序库,让千锤百炼后得到验证的代码得到复用,避免重复劳动,提高工效。IDE这个词和一些没有关连性的命令行工具(像viemacsmake)是一种对照,这个IDE提供许多的功能,例如:制作、修改、编译、发布、调试。IDE的想法是把各种命令行的开发工具结合起来,提供一个抽象化的工具,来减少学习编程语言的时间,增加开发人员的生产力,让开发更加快捷方便,通过提供工具和各种性能来帮助开发者组织资源,减少失误,提供捷径。

 

拥有标准程序库与IDE环境的程序员就跟拥有新鲜食材和厨神套装的厨子一样了,只有经过厨师长过目的菜才可以上桌,只有经过审核和优化的代码才有会走到下一个步骤的资格。人工审核和优化是有必要的,但是由于人员素质和主观因素对代码质量造成的影响很大,所以使用工具对码出来的代码进行静态代码检查和动态代码分析成为了高质量代码的必经阶段。

 

静态代码检查是指无需运行被测代码,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。目前市场上的C/C++ 静态代码分析工具种类繁多且各有千秋,当前4种主流C/C++静态代码分析工具是cppcheckcoverityclangpclint。统计证明,在整个软件开发生命周期中,30%  70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。所以C++ 静态代码分析工具能够帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省开发成本。

 

与静态分析相反,动态分析是通过在真实或虚拟处理器上执行该软件构建的程序来执行的。一般是通过观察程序在运行过程中的状态,如寄存器内容,函数执行结果,内存使用情况等等,分析函数功能,明确代码逻辑,挖掘可能存在的漏洞。通过动态分析数据流,构造特殊输入数据来触发程序的潜在错误,对比运行得到的结果与期望获得的结果之间的差别,以便确定目标函数在安全方面有没有存在缺陷,并对比分析所得到的结果。目前市场上的C/C++的动态代码分析工具也数不胜数,根据不同的需求使用不同的工具达到其目的,主要有gdb, olldbg, valgrind等。

 

这样通过各种工具的摧残蜕变后的代码无限接近或者达到高质量的代码的标准了,还减少因为人员素质等主观因素对代码质量的影响,同时提高了码代码的效率,实现了鱼和熊掌得兼的目标。菜鸟也可以通过对工具的使用逐步迈向大神。

 

恒生技术之眼原创文章,未经授权禁止转载。详情见转载须知

联系我们

恒 生 技 术 之 眼