华为C语言编程规范总结

embedded/2025/1/11 4:07:30/

1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译,会增加大量编译工作量,延长编译时间,因此:
    1.1 头文件里尽量少包含头文件
    1.2 头文件应向稳定的方向包含

2.每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口

3.所有头文件都应当使用#define 防止头文件被多重包含,命名格式为FILENAME_H,为了保证唯一性,更好的命名是PROJECTNAME_PATH_FILENAME_H。注意最前面没有'_'或'__',因为一般以单下划线"_"和双下划线"__"开头的标识符为ANSI C等使用

4.只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量

5. 一个模块通常包含多个.c文件,建议放在同一个目录下,目录名即为模块名。为方便外部使
用者,建议每一个模块提供一个.h,文件名为目录名

6.避免函数过长,新增函数不超过50行(非空非注释行),过长的函数往往意味着函数功能不单一,过于复杂

7.避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层

8.在带操作系统编程时,全局变量和静态变量都属于共享资源,在使用时都得做互斥处理,因此函数中尽量少使用全局变量和静态变量,一旦使用将会使该函数的可重入性大大降低

9.设计高扇入,合理扇出(小于7)的函数,扇出表示该函数内部调用其它函数的数目

10.标识符命名规则建议使用unix like风格:单词用小写字母,每个单词直接用下划线„_‟分割,例  如text_mutex

11.文件命名统一采用小写字符,因为不同系统对文件名大小写处理会不同(如MS的DOS、Windows系统不区分大小写,但是Linux系统则区分)

12.全局变量应增加“g_”前缀,静态变量应增加“s_”前缀

13. 一个变量只有一个功能,不能把一个变量用作多种用途

14.建议定义一个STATIC宏,在调试阶段,将STATIC定义为static,版本发布时,改为空,以便于后续的打补丁等操作。

15.用宏定义表达式时,要使用完备的括号,如#define RECTANGLE_AREA(a, b) a * b 应该定为         #define RECTANGLE_AREA(a, b) ((a) * (b))

16.当宏定义中涉及多个表达式时,最好用do{}while(0)包含

17.使用宏和函数时,不允许参数发生变化,如:
    #define SQUARE(a) ((a) * (a))
    int a = 5;
    int b;
    b = SQUARE(a++); // 结果:a = 7,即执行了两次增

18.除非必要,应尽可能使用函数代替宏

19.常量建议使用const定义代替宏:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分;宏定义的标志字符/符号编译器是看不到的,因为已经被预处理器处理掉了,所以在编译报错或调试时是完全看不到这个符号的,如定义了一个数字,你只看得到数字本身,因此很不利于调试

20.代码质量保证优先原则 
(1)正确性,指程序要实现设计要求的功能。
(2)简洁性,指程序易于理解并且易于实现。
(3)可维护性,指程序被修改的能力,包括纠错、改进、新需求或功能规格变化的适应能力。
(4)可靠性,指程序在给定时间间隔和环境条件下,按设计要求成功运行程序的概率。
(5)代码可测试性,指软件发现故障并隔离、定位故障的能力,以及在一定的时间和成本前提下,进
行测试设计、测试执行的能力。
(6)代码性能高效,指是尽可能少地占用系统资源,包括内存和执行时间。
(7)可移植性,指为了在原来设计的特定环境之外运行,对系统进行修改的能力。
(8)个人表达方式/个人方便性,指个人编程习惯。

21.禁止内存操作越界,尤其在使用字符串时,字符串默认都是以'\0'(即0x00)结尾的,在使用/操作字符串时,注意有没有'\0'结尾,建议使用限制字符数量的字符串操作函数代替一些危险函数,如:用strncpy()代替strcpy();用strncat()代替strcat();用snprintf()代替sprintf()

22.禁止内存泄漏,如忘记释放内存

23.对于多维大数组,避免来回跳跃式访问数组成员。

24.优秀的代码可以自我解释,不通过注释即可轻易读懂。优秀的代码不写注释也可轻易读懂,注释无法把糟糕的代码变好,需要很多注释来解释的代码往往存在坏味道,需要重构。

25.文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者姓名、工号、内
容、功能说明、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。

26.全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。

27.注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文
除非能用非常流利准确的英文表达。对于有外籍员工的,由产品确定注释语言。

28.多个短语句(包括赋值语句)不允许写在同一行内,即一行只写一条语句

29.if、for、do、while、case、switch、default等语句独占一行

30.产品代码中经常有如下代码:

int foo()
{if (异常条件) { 异常处理;return ERR_CODE_1;}if (异常条件){ 异常处理;return ERR_CODE_2;}正常处理;return SUCCESS;
}
这样的代码看起来很清晰,而且也避免了大量的 if else 嵌套。但是从性能的角度来看,应该把执行概 率较大的分支放在前面处理,由于正常情况下的执行概率更大,若首先考虑性能,应如下写:
int foo()
{ if (满足条件) { 正常处理; return SUCCESS; } else if (概率比较大的异常条件) { 异常处理;return ERR_CODE_1; } else{ 异常处理;return ERR_CODE_2; } 
}
除非证明 foo 函数是性能瓶颈,否则按照本规则, 应优先选用前面一种写法
记住: 让一个正确的程序更快速,比让一个足够快的程序正确,要容易得太多 。大多数时候,不要把 注意力集中在如何使代码更快上,应首先关注让代码尽可能地清晰易读和更可靠。
31.赋值语句不要写在if等语句中,或者作为函数的参数使用;因为if语句中,会根据条件依次判断,如果前一个条件已经可以判定整个条件,则后续条件语
句不会再运行
32.用括号明确表达式的操作顺序,避免过分依赖默认优先级。

http://www.ppmy.cn/embedded/152904.html

相关文章

MYSQL-------------优化MYSQLserver磁盘 I/O 问题及相关优化策略

MySQL Server 性能优化参数设置 查看 MySQL Server 参数 在 MySQL 中,可以使用以下命令查看服务器参数: SHOW VARIABLES; -- 查看所有服务器参数SHOW VARIABLES LIKE parameter_name; -- 查看特定参数,例如 SHOW VARIABLES LIKE key_buf…

python基础004--flask

文章目录 1.学习目的2.web开发3.代码4.结果展示1.学习目的 最近有粉丝想我写一篇关于web开发的python案例,于是借此机会,2024年最后一天,写一个,祝大家学业有成,万事如意,平安喜乐~ 2.web开发 使用Python进行Web开发通常涉及以下步骤: 选择Web框架: 选择一个适合你项…

《OpenCV》——模版匹配

文章目录 什么是模版匹配?函数介绍实例 什么是模版匹配? 模板匹配是在一幅图像中寻找与另一幅模板图像最匹配部分的技术。OpenCV 提供了多种模板匹配的方法,它在目标检测、物体识别等众多计算机视觉任务中有广泛的应用。例如,你有…

jQuery UI 主题

关于“jQuery UI 主题”,我找到了一些有用的信息。 首先,jQuery UI 主题允许开发人员无缝集成UI小部件到他们网站或应用程序的外观和感观。每个插件通过CSS定义样式,包含两层样式信息:标准的jQuery UI CSS框架样式和具体的插件样…

Linux安装MySQL

在Linux系统上安装MySQL数据库,可以根据服务器是否有网络连接选择不同的安装方式。以下分别介绍在线安装(通过yum)和离线安装(手动下载.tar包)的详细步骤: 一、在线安装(通过yum) 检…

网站自动签到

我研究生生涯面临两个问题,一是写毕业论文,二是找工作,这两者又有很大的冲突。怎么解决这两个冲突呢?把python学好是一个路子,因此从今天我要开一个专栏就是学python 其实我的本意不是网站签到,我喜欢在起点…

tdengine数据库使用java连接

1 首先给你的项目添加依赖 <dependency> <groupId>com.taosdata.jdbc</groupId> <artifactId>taos-jdbcdriver</artifactId> <version>3.4.0</version> <!-- 表示依赖不会传递 --> </dependency> 注意&am…

腾讯云大数据智能管家:AI驱动管理效能飞升

点击蓝字⬆ 关注我们 本文共计1241 预计阅读时长4分钟 在大数据时代&#xff0c;海量数据的产生给企业带来了新的机遇&#xff0c;也带来了复杂的管理挑战。如何高效利用数据资源、降低运维成本、提升系统性能成为每个企业的共同难题。腾讯云推出的大数据智能管家&#xff0c;以…