硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8488|回复: 6
收起左侧

安富莱C语言编码规范 6--函数

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2018-3-20 15:46:27 | 显示全部楼层 |阅读模式
安富莱C语言编码规范 6--函数


1、函数的命名规则。每一个函数名前缀需包含模块名,模块名为小写,与函数名区别开。
如:uartReceive(串口接收)
备注:对于非常简单的程序,可以不加模块名。


2、函数的的形参需另启一行,在后面给予说明,形参都以下划线_开头,已示与普通变量进行区分,对于没有形参为空的函数(void)括号紧跟函数后面。
  1. /******************************************************************************

  2. * 函数名:uartConvUartBaud

  3. * 功 能:波特率转换

  4. * 输 入: _ulBaud : 波特率

  5. * 输 出:无

  6. * 返 回:uint32- 转换后的波特率值

  7. */

  8. uint32_t uartConvUartBaud(uint32_t _ulBaud)

  9. {

  10. uint32_t ulBaud;

  11. ulBaud = ulBaud * 2; /* 计算波特率 */

  12. ......

  13. return ulBaud;

  14. }
复制代码

3、一个函数仅完成一件功能。

4、函数名应准确描述函数的功能。避免使用无意义或含义不清的动词为函数命名。使用动宾词组为执行某操作的函数命名。
说明:避免用含义不清的动词如process、handle等为函数命名,因为这些动词并没有说明要具体做什么。
示例:参照如下方式命名函数。
  1. void PrintRecord(uint32_t _RecInd);

  2. int32 InputRecord(void);

  3. uint8_t GetCurrentColor(void);
复制代码

5、检查函数所有参数输入的有效性。
说明:如果约定由调用方检查参数输入,则应使用assert()之类的宏,来验证所有参数输入的有效性。


6、检查函数所有非参数输入的有效性,如数据文件、公共变量等。
说明:函数的输入主要有两种:一种是参数输入;另一种是全局变量、数据文件的输入,即非参数输入。函数在使用输入之前,应进行必要的检查。


7、防止将函数的参数作为工作变量。
说明:将函数的参数作为工作变量,有可能错误地改变参数内容,所以很危险。对必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。


8、避免设计五个以上参数函数,不使用的参数从接口中去掉。
说明:目的减少函数间接口的复杂度,复杂的参数可以使用结构传递。


9、在调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制数据类型转换。
说明:因为数据类型转换或多或少存在危险。


10、避免使用 BOOL 参数。
说明:原因有二,其一是BOOL参数值无意义,TURE/FALSE的含义是非常模糊的,在调用时很难知道该参数到底传达的是什么意思;其二是BOOL参数值不利于扩充。还有NULL也是一个无意义的单词。


11、函数的返回值要清楚、明了。除非必要,最好不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。

12、防止把没有关联的语句放到一个函数中。
说明:防止函数或过程内出现随机内聚。随机内聚是指将没有关联或关联很弱的语句放到同一个函数或过程中。随机内聚给函数或过程的维护、测试及以后的升级等造成了不便,同时也使函数或过程的功能不明确。使用随机内聚函数,常常容易出现在一种应用场合需要改进此函数,而另一种应用场合又不允许这种改进,从而陷入困境。
      在编程时,经常遇到在不同函数中使用相同的代码,许多开发人员都愿把这些代码提出来,并构成一个新函数。若这些代码关联较大并且是完成一个功能的,那么这种构造是合理的,否则这种构造将产生随机内聚的函数。
示例:如下函数就是一种随机内聚。
  1. void InitVar( void )

  2. {

  3. Rect.length = 0;

  4. Rect.width = 0; /* 初始化矩形的长与宽 */

  5. Point.x = 10;

  6. Point.y = 10; /* 初始化“点”的坐标 */

  7. }
复制代码

矩形的长、宽与点的坐标基本没有任何关系,故以上函数是随机内聚。
应如下分为两个函数:
  1. void InitRect( void )

  2. {

  3. Rect.length = 0;

  4. Rect.width = 0; /* 初始化矩形的长与宽 */

  5. }

  6. void InitPoint( void )

  7. {

  8. Point.x = 10;

  9. Point.y = 10; /* 初始化“点”的坐标 */

  10. }
复制代码

13、减少函数本身或函数间的递归调用。
说明:递归调用特别是函数间的递归调用(如A->B->C->A),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。


14、改进模块中函数的结构,降低函数间的耦合度,并提高函数的独立性以及代码可读性、效率和可维护性。优化函数结构时,要遵守以下原则:
(1)能影响模块功能的实现。
(2)仔细考查模块或函数出错处理及模块的性能要求并进行完善。
(3)通过分解或合并函数来改进软件结构。
(4)考查函数的规模,过大的要进行分解。
(5)降低函数间接口的复杂度。
(6)不同层次的函数调用要有较合理的扇入、扇出。
(7)函数功能应可预测。
(8)提高函数内聚。(单一功能的函数内聚最高)
说明:对初步划分后的函数结构应进行改进、优化,使之更为合理。

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

32

主题

295

回帖

391

积分

高级会员

积分
391
发表于 2018-6-14 08:59:27 | 显示全部楼层
谢谢
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2019-9-7 22:50:52 | 显示全部楼层
谢谢, 很好!!!
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2019-9-9 14:51:19 | 显示全部楼层
很好,简单易懂。 有没有整理的完整的文档供下载?
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2019-10-16 11:31:49 | 显示全部楼层
硬汉的资料都是经典,强烈支持,,,,,,,,,,,,,,,,,,,,,,,
回复

使用道具 举报

0

主题

31

回帖

31

积分

新手上路

积分
31
发表于 2021-5-11 10:18:42 | 显示全部楼层
谢谢群主               
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 15:13 , Processed in 0.187021 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表