〇、前言

代码编程我认为也是一门艺术,优美的代码使人赏心悦目。然而编程规范并没有唯一的行业标准,就像windows和linux的代码各具风格。本文是作者本人在多年嵌入式软件开发中所总结出的一些经验,仅作读者参考。

一、排版格式

0.在同一个项目中的所有代码应保持一致的代码风格,引用第三方库文件源码的除外。
1.代码行首缩进使用TAB键,TAB宽度设置为4个字符。
2. 一条语句占一行,不要把多条语句写到一行。
3. 每行代码不要超过100个字符,含有字符串的语句可酌情延长(如打印日志)。
4. 这些关键字须独占一行:if、else、for、do、while、switch、case、default等。
5. 所有的if、else、for、do、while语句后面都要加上花括号{}。
6. 代码块的花括号{}应独占一行,并且保持代码块和花括号缩进对齐。
7. 相对独立的代码块之间应添加一个空行分隔开。
8. 在文件末尾添加一个空行。
9. 定义指针变量时星号的位置应远离类型,向右靠近变量。
10.函数的多个参数之间使用一个空格隔开,有利于阅读。

二、注释

0.注释的原则是以人为本,注释语言尽量使用简体中文,必须准确、简洁、易懂。
1.在源文件的头部添加注释,列出该模块的关键性功能说明、作者、创建日期等。
2.对接口函数进行详细注释,列出函数的功能、输入参数、返回值。
3.对内部函数进行简要注释,列出函数的功能和必要的参数说明。
4.对代码块和函数的注释应放在其上方相邻位置,单行代码和变量注释放在右方相邻位置。
5.禁止在一行代码或表达式的中间插入注释。
6.单行注释使用//,多行注释使用/**/。

三、命名规则

0.标识符的命名要简洁明了,能够通过名称直观地了解到该标识符所表达的含义。
1.通常用一个或多个英文单词来命名,原则上禁止使用中文拼音,多个单词之间用下划线连接。
2.遇到太长的英文单词可以采用缩写的形式,缩写可以去掉元音字母或者截取单词的前面几个字母,尽量采用大家都能理解的缩写单词。
3.对于理解有困难的缩写应该加以注释。
4.变量、函数、结构体、类型定义标识符使用小写字母。
6.宏、常量、枚举成员使用大写字母。
6. 循环变量等具有特殊含义的变量可以使用单个字符作为变量名字(形如i、j、k)。
7. 变量命名不要在变量名前面添加冗余类型前缀。
例如:unsigned int ui_size;
改为:unsigned int size;
8. 防止全局变量和静态变量与局部变量冲突,可添加特定前缀(g_、m_)表明作用域。
9. 使用typedef定义的类型标识符使用“_t”做为后缀。
10. 作用域为全局范围的函数、宏、枚举成员,应使用模块化的命名规则。即:以模块/对象名作为前缀。

四、声明与定义

0.尽量使用编程语言提供的标准数据类型,如char、int、float等。
1.不要自行定义固定字长的数据类型,因为标准库<stdint.h>已经提供了此类型(如uint8_t、int32_t等)。
2.谨慎使用条件编译功能,因为条件编译会降低代码可读性。
3.项目中广泛引用的数据类型或定义,应考虑把它们集中到一个头文件中,如<define.h>。
4.频繁使用的代码块应考虑定义成为函数。
5.避免随机乱序定义变量,将具有关联性的变量定义放到一起。
6.文件内部引用的全局变量和函数必须加上static声明。
7.被引用的枚举类型应使用typedef定义为自定义类型。
8.结构体的使用者如果不会访问其成员变量,则应使用typedef定义为自定义类型。
9.每个.c文件最多只能有一个与之对应的.h头文件声明其对外输出的接口函数。
10.明确头文件的使用者,不要在头文件中定义使用者不关心的数据定义或函数。

五、 模块化编程

0.模块化编程即是把整个项目代码分解为一个个功能独立的模块,良好的模块化设计可以极大地提高代码的维护性和复用性。
1.一个模块通常由一个或多个.c源文件和一个声明接口的.h头文件组成。
2.模块化设计的关键在于分解功能,一个模块只实现较为独立的单一功能。
3.根据模块所实现的功能大致分为应用层、功能层、驱动层,可以细分更多层次。
4.应用层属于最顶层,是整个项目业务需求最直观的体现,依赖于下层的模块。应用层的模块通常提供的接口函数很少,且都是初始化、启动、停止等操作。
5.功能层属于中间层,一般用于连接应用层和驱动层的桥梁,是实现业务需求的支柱。功能层的模块通常处理驱动层的数据传递给应用层,比如协议解析,数据处理等。
6.驱动层属于最低层,负责和底层硬件打交道,只处理硬件数据,不关心具体应用。因此驱动层的代码应该具有很强的可复用性,在不同的项目中应该可以直接重复使用。
7.函数调用层次需遵循上层模块调用同层或下层模块的接口,切勿在底层模块中直接调用上层模块的函数。
8.模块之间通信使用轮寻或回调函数的方式,降低各模块之间的耦合性。