华为C语言编程规范总结

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.mzph.cn/pingmian/66849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 生成24bit音频数据实例解析

一 概念 24 bit 是指音频文件的 采样深度 (bit depth)。 它代表了每个采样点的数据精度,也就是音频每个样本所使用的比特数。 24 bit 的采样深度相较于 16 bit 提供了更高的动态范围和更精确的音频信息表示。 动态范围:24 bit 的…

PyTorch:.max(1)和.max(0)的使用

目录 1).max(1)的使用: 2).max(0)的使用: 1).max(1)的使用: 假设有一个形状为 ( m , n ) 的 Tensor x ,其中m表示行数,n表示列数。 x.max(1) ,相当于x.max(dim1) 。作…

Vue 3 Diff 算法过程及基本实现方式

Vue 3 的 Diff 算法 Vue 3 使用的是一种高效的 DOM Diff 算法,主要用于在虚拟 DOM 树发生变化时,计算最小的操作以更新真实 DOM。相比 Vue 2,Vue 3 的 Diff 算法做了很多优化。 Diff 算法的背景与目的 虚拟 DOM 树的对比:在 Vue…

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener

任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener Scheduler 调度器scheduler是Quartz中的独立工作容器,所有的Trigger和Job都需要注册到scheduler中才能工作。我们可以通过SchedulerFactory来获取scheduler实例。如下: //1.获取默认的标准…

解锁 C# 与 LiteDB 嵌入式 NoSQL 数据库

一、开篇:邂逅 C# 与 LiteDB 新世界 在当今的软件开发领域,数据管理如同建筑的基石,而选择一款合适的数据库则是项目成功与否的关键因素之一。对于 C# 开发者来说,面对琳琅满目的数据库选项,如何抉择常常令人头疼。今…

Dependency check 通过Maven构建时,配置Mysql数据库遇到的三个坑

使用过Dependency check的同学,一定会遇到这个问题—— 每次执行依赖扫描时,由于网络问题会导致NVD下载种子数据的过程中的种种失败,不仅浪费了大量时间,还会因为下载文件的不完整性直接导致依赖检测的失败。所以我在使用Dependen…

Ubuntu中批量重命名,rename

你可以使用下面的命令批量重命名这些文件,在文件名中插入 _1: 方式一 使用 mv 命令批量重命名 如果你已经在终端中,且当前目录包含这些文件,可以执行以下命令: mv ai.c ai_1.c mv ai.h ai_1.h mv ao.c ao_1.c mv a…

JVM 优化指南

JVM 优化指南 1. JVM 参数配置 1.1 基础参数配置 设置堆内存大小 -Xms2048m -Xmx2048m 设置新生代大小 -Xmn1024m 设置元空间大小 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize256m 设置线程栈大小 -Xss512k1.2 垃圾回收器配置 使用 G1 垃圾回收器 -XX:UseG1GC 设置期望停顿…

【面试题】技术场景 5、日志采集ELK

日志采集的重要性与采集方式 重要性:在项目开发、测试及生产环境中,日志是定位系统问题的关键手段,对系统维护与问题排查至关重要。采集方式 常规采集:按天保存日志文件至专门目录,文件名包含项目名、端口及日期&…

【数据库】三、SQL语言

文章目录 三、SQL语言1 概述2 数据定义(DDL)2.1 定义数据库2.2 定义基本表2.3 修改基本表2.4 删除基本表 3 数据操作(DML)3.1 数据查询3.1.1 单表查询3.1.2 连接查询3.1.3 嵌套查询3.1.4 集合查询 3.2 数据更新3.2.1 插入数据3.2.2 修改数据3.2.3 删除数据 4 数据控制(DCL)5 视…

C++ 的 pair 和 tuple

1 std::pair 1.1 C 98 的 std::pair 1.1.1 std::pair 的构造 ​ C 的二元组 std::pair<> 在 C 98 标准中就存在了&#xff0c;其定义如下&#xff1a; template<class T1, class T2> struct pair;std::pair<> 是个类模板&#xff0c;它有两个成员&#x…

Ubuntu | PostgreSQL | 解决 ERROR: `xmllint` is missing on your system.

解决 sudo apt install apt-file sudo apt-file updatesudo apt-file search xmllint sudo apt install libxml2-utils执行 # postgres源码安装包解压文件夹中 make install make install问题 make -C src install make[2]: Entering directory /home/postgres/postgresql-1…

springboot 加载本地jar到maven

在Spring Boot项目中&#xff0c;如果你想要加载一个本地的jar文件到Maven本地仓库&#xff0c;你可以使用Maven的install-file目标来实现。以下是一个简单的例子&#xff1a; 打开命令行工具&#xff08;例如&#xff1a;终端或者命令提示符&#xff09;。 执行以下Maven命令…

HTML5 Audio(音频)

HTML5 Audio(音频) HTML5 的 <audio> 元素是一个重要的革新,它为网页开发者提供了一种简单的方式来嵌入音频内容。在这篇文章中,我们将探讨 HTML5 <audio> 元素的特性、用法、浏览器兼容性,以及如何通过 JavaScript 和 CSS 对其进行控制和定制。 1. HTML5 <…

Unity中 Xlua使用整理(二)

1.Xlua的配置应用 xLua所有的配置都支持三种方式&#xff1a;打标签&#xff1b;静态列表&#xff1b;动态列表。配置要求&#xff1a; 列表方式均必须是static的字段/属性 列表方式均必须放到一个static类 建议不用标签方式 建议列表方式配置放Editor目录&#xff08;如果是H…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库&#xff0c;它提供了强大的功能来绘制不同类型的图表。在实际应用中&#xff0c;通常需要将多个图表绘制在同一个画布上&#xff0c;这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…

全方位解读消息队列:原理、优势、实例与实践要点

全方位解读消息队列&#xff1a;原理、优势、实例与实践要点 一、消息队列基础认知 在数字化转型浪潮下&#xff0c;分布式系统架构愈发复杂&#xff0c;消息队列成为其中关键一环。不妨把消息队列想象成一个超级“信息驿站”&#xff0c;在古代&#xff0c;各地的信件、物资运…

【LLM】25.1.10 Arxiv LLM论文速递

25.1.9 12:00 - 25.1.10 12:00 共更新44 篇 —第1篇---- ===== AgroGPT: 高效的农业视觉-语言模型与专家调优 🔍 关键词: 农业, 视觉-语言模型, 大型多模态对话模型, 专家调优 PDF链接 摘要: 在推进大型多模态对话模型(LMMs)方面已经取得了显著进展,利用了在线可用的…

Scala语言的软件开发工具

Scala语言的软件开发工具 Scala是一种强类型、函数式编程语言&#xff0c;融合了面向对象和函数式编程的特性&#xff0c;近年来受到越来越多开发者的关注。在Scala生态系统中&#xff0c;有许多优秀的工具和框架可以帮助开发者提高生产力、简化开发流程。本文将探讨一些常用的…