安富莱C语言编码规范

所谓无规矩不成方圆。任何团队,规范都是怎么也绕不开的话题。特别是在我们搞嵌入式c开发的,代码规范乃是开发的重中之重。有太多的理由去做规范,因为每个人的代码编写喜好不同,代码风格也迥然不同。每一个程序员心目中对好代码都有自己的主见,统一的编码规范可以像秦始皇统一战国一样,避免不必要的论战和争议。    有时候会帮同学看一下代码,发现大多写代码都是随心所欲。看起开非常头大,虽然c语言很重要,但是c语言代码规范也非常重要。今天分享的就是安富莱c语言编码规范,建议初学者去官网看看他们的代码,非常标准!   一、文件与目录     1、文件及目录的命名规定可用的字符集是a-z;a-z;0-9;._-。
    2、源文件名后缀用小写字母.c和.h。
    3、文件的命名要准确清晰地表达其内容,同时文件名应该精练,防止文件名过长而造成使用不便。在文件名中可以适当地使用缩写。
    以下提供两种命名方式以供参考:
    (1)各程序模块的文件命名开头 2 个小写字母代表本模块的功能:如:主控程序为mpmain.c,mpdisp.c … 
    (2)不写模块功能标识:如:主控程序为main.c,disp.c …
    4、一个软件包或一个逻辑组件的所有头文件和源文件建议放在一个单独的目录下,这样有利于查找并使用相关的文件,有利于简化一些编译工具的设置。
    5、对于整个项目需要的公共头文件,应存放在一个单独的目录下(例如:myproject/include)下,可避免其他编写人引用时目录太过分散的问题。
    6、对于源码文件中的段落安排,我们建议按如下的顺序排列:
a. 文件头注释 b. 防止重复引用头文件的设置 c. #include 部分 d. #define 部分 e. enum 常量声明 f. 类型声明和定义,包括 struct、union、typedef 等 g. 全局变量声明 h. 文件级变量声明 i. 全局或文件级函数声明 j. 函数实现。按函数声明的顺序排列 k. 文件尾注释     7、在引用头文件时,不要使用绝对路径。如果使用绝对路径,当需要移动目录时,必须修改所有相关代码,繁琐且不安全;使用相对路径,当需要移动目录时,只需修改编译器的某个选项即可。
    #include “/project/inc/hello.h” /* 不应使用绝对路径 */#include “../inc/hello.h” /* 可以使用相对路径 */     8、在引用头文件时,使用 来引用预定义或者特定目录的头文件,使用 “” 来引用当前目录或者路径相对于当前目录的头文件。
        #include /* 标准头文件 */#include /* 工程指定目录头文件 */#include “global.h” /* 当前目录头文件 */#include “inc/config.h” /* 路径相对于当前目录的头文件 */     9、为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
          #ifndef __disp_h /* 文件名前名加两个下划线“__”,后面加 “_h”#define __disp_h......#endif     10、头文件中只存放“声明”而不存放“定义”,通过这种方式可以避免重复定义。
          /* 模块 1 头文件:module1.h */extern int a = 5; /* 在模块 1 的 .h 文件中声明变量 *//* 模块 1 实现文件:module1.c */uint8_t g_ucpara; /* 在模块 1 的 .h 文件中定义全局变量 g_ucpara */     11、如果其它模块需要引用全局变量g_ucpara, 只需要在文件开头包含module1.h
          /* 模块 2 实现文件:module2.c */#include “module1.h” /* 在模块 2 中包含模块 1 的 .h 文件 */......g_ucpara = 0;......     12、对于文件的长度没有非常严格的要求,但应尽量避免文件过长。一般来说,文件长度应尽量保持在1000行之内。
  二、排版     1、程序块要采用缩进风格编写,缩进的空格数为 4 个。
    2、相对独立的程序块之间、变量说明之后必须加空行。
                                                            void demofunc(void){uint8_t i;<---- 局部变量和语句间空一行/* 功能块 1 */for (i = 0; i < 10; i++){...}<---- 不同的功能块间空一行/* 功能块 2 */for (i = 0; i < 20; i++){...}}     3、作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
                  if ((ucparam1 == 0) && (ucparam2 == 0) && (ucparam3 == 0)|| (ucparam4 == 0)) <---- 长表达式需要换行书写{......}     4、不允许把多个短语句写在一行中,即一行只写一条语句。
          rect.length = 0; rect.width = 0; <---- 不正确的写法rect.length = 0; <---- 正确的写法rect.width = 0;     5、对齐使用tab 键,1 个 tab 对应 4 个字符位。
    6、函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求。
    7、程序块的分界符(如大括号‘{’和‘}’ )应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、结构的定义、枚举的定义以及 if、for、do、while、switch、case 语句中的程序都要采用如上的缩进方式。对于与规则不一致的现存代码,应优先保证同一模块中的风格一致性。
                                                          for (...) { <---- 不规范的写法... /* program code */}for (...){ <---- 规范的写法... /* program code */}if (...){ <---- 不规范的写法... /* program code */}if (...){ ),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。
    由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在 c语言中括号已经是最清晰的标志了。
    在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。
    (1)逗号、分号只在后面加空格。
  int_32 a, b, c;     (2)比较操作符,赋值操作符=、 +=,算术操作符+、%,逻辑操作符&&、&,位域操作符<= max_time_value)a = b + c;a *= 2;a = b ^ 2;     (3)!、~、++、--、&(地址运算符)等单目操作符前后不加空格。
        *p = 'a'; /* 内容操作*与内容之间 */flag = !isempty; /* 非操作!与内容之间 */p = &mem; /* 地址操作& 与内容之间 */i++; /* ++,--与内容之间 */     (4)->、.前后不加空格。
  p->id = pid; /* ->指针前后不加空格 */     (5)if、for、while、switch 等与后面的括号间应加空格,使 if 等关键字更为突出、明显,函数名与其后的括号之间不加空格,以与保留字区别开。
  if (a >= b && c > d)   三、注释     1、 一般情况下,源程序有效注释量必须在 20%以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
    2、在文件的开始部分,应该给出关于文件版权、内容简介、修改历史等项目的说明。具体的格式请参见如下的说明。在创建代码和每次更新代码时,都必须在文件的历史记录中标注版本号、日期、作者、更改说明等项目。其中的版本号的格式为两个数字字符和一个英文字母字符。数字字符表示大的改变,英文字符表示小的修改。如果有必要,还应该对其它的注释内容也进行同步的更改。注意:注释第一行星号要求为 76 个,结尾行星号为 1 个。
                                        /******************************************************************* copyright (c), 2010-2011,武汉xxx系统有限责任公司* 文件名: main.c* 内容简述:** 文件历史:* 版本号 日期 作者 说明* 01a 2020-07-29 xxx 创建该文件* 01b 2020-08-20 xxx 改为可以在字符串中发送回车符* 02a 2020-12-03 xxx 增加文件头注释*/     3、对于函数,在函数实现之前,应该给出和函数的实现相关的足够而精练的注释信息。内容包括本函数功能介绍,调用的变量、常量说明,形参说明,特别是全局、全程或静态变量(慎用静态变量),要求对其初值,调用后的预期值作详细的阐述。具体的书写格式和包含的各项内容请参见如下的例子。
    下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。
                          /***************************************************************** 函数名: sendtocard()* 功 能: 向读卡器发命令,如果读卡器进入休眠,则首先唤醒它* 输 入: 全局变量 gatxcard[]存放待发的数据* 全局变量 gbtxcardlen 存放长度* 输 出: 无*/     4、边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
    5、注释的内容要清楚、明了,含义准确,防止注释二义性。说明:错误的注释不但无益反而有害。注释主要阐述代码做了什么(what),或者如果有必要的话,阐述为什么要这么做(why),注释并不是用来阐述它究竟是如何实现算法(how)的。
    6、避免在注释中使用缩写,特别是非常用缩写。说明:在使用缩写时或之前,应对缩写进行必要的说明。
    7、注释应与其描述的代码靠近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
    例 1:不规范的写法
              /* 获取复本子系统索引和网络指示器 */<---- 不规范的写法,此处不应该空行repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;     例 2:不规范的写法
          repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;/* 获取复本子系统索引和网络指示器 */ <---- 不规范的写法,应该在语句前注释     例 3:规范的写法
          /* 获取复本子系统索引和网络指示器 */repssn_ind = ssn_data[index].repssn_index;repssn_ni = ssn_data[index].ni;     例 4:不规范的写法,显得代码过于紧凑
              /* code one comments */program code one/* code two comments */ <---- 不规范的写法,两段代码之间需要加空行program code two     例 5:规范的写法
              /* code one comments */program code one/* code two comments */program code two     8、注释与所描述内容进行同样的缩排。说明:可使程序排版整齐,并方便注释的阅读与理解。
    例 1:如下例子,排版不整齐,阅读稍感不方便。
                          void example_fun( void ){/* code one comments */ <---- 不规范的写法,注释和代码应该相同的缩进codeblock one/* code two comments */ b->c->a),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。
    14、改进模块中函数的结构,降低函数间的耦合度,并提高函数的独立性以及代码可读性、效率和可维护性。优化函数结构时,要遵守以下原则:
能影响模块功能的实现。 仔细考查模块或函数出错处理及模块的性能要求并进行完善。 通过分解或合并函数来改进软件结构。 考查函数的规模,过大的要进行分解。 降低函数间接口的复杂度。 不同层次的函数调用要有较合理的扇入、扇出。 函数功能应可预测。 提高函数内聚。(单一功能的函数内聚最高)     说明:对初步划分后的函数结构应进行改进、优化,使之更为合理。

PCB生产工艺 | 第十道主流程之表面处理
汽车电机控制器的组成介绍
自动电子门铃开关电路
NI推出用于NI PXI模块化仪器的InstrumentStudio软件
用于自动驾驶感知开发的仿真方案
安富莱C语言编码规范
美方否决中企并购爱思强 德国方面将对收购案继续审查
美国缅因州受到网络攻击后研发“智能公用事业”的广泛技术传感器
外媒:拜登对于华为的立场仍然是“模糊”的
满足工业需求的高性能/高精度/4–20mA电流环变送器
为何从供应链管理领域关注物联网?
SiC器件在电能质量控制产品中的应用
PCB光学检查:用法和方法
硅基OLED或成下一代微显示技术,硅基OLED行业市场成多局发展
雷曼光电2019年半年度报告 LED显示及照明产品齐增长
三星、SK海力士提高闪存产能 SSD降价可期
关于智能穿戴手表、手环及VR相关的产品及材料设备信息
工业云组态应用平台的介绍,它的特性是什么
诺基亚9最新消息:诺基亚8/9设计图曝光 全面屏设计帅爆
NPN传感器和PNP传感器的区别是什么