黑金动力社区:http://www.heijin.org
声明:本文为XiaomaGee编写,版权由XiaomaGee和本博文作者所有,如需转载请标明出处
良好的代码风格及编程规范,是书写优良代码的基础,也是工程师必备的技能。本规范遵循C语言的创始人B.W.Kernighan和D.M.Ritchit (简称 K & R)所著的《The C Programming Language》一书的示例,并参照 Linux 内核代码风格。
本规范适用于有一定c语言基础的读者,对于需要入门的,建议熟读几遍《The C Programming Language》。另外本规范部分内容仅适用于基于单片机、arm等嵌入式处理器的固件开发。
函数体、if、for、while、switch case、do while等都需要使用缩进。不管你用任何编辑器或者是集成开发环境,缩进均是基于“Tab”键的,而不是基于“空格”键。一般来说,我采用 8 个字符的缩进长度。例如:
空格和空行的出现,是以增强程序的可读性为目的。但是不要插入过多(两个以上)的空格和空行。函数开始局部变量声明后需加一个空行,函数内逻辑相对独立的部分,需加一个空行。文件结尾需加一个空行。
代码中加入空格是以程序逻辑清晰为目的。c关键字后需加空格,例如:
函数的大括号位于函数体的第二行与末行,if、while、switch、do的大括号位于关键字所在行的行尾和逻辑末行,末行的大括号与关键字上下对齐。例如:
C语言源文件主要包括 .c文件和 .h 文件。文件命名要以体现其意义的名词为主,例如芯片 max525的驱动程序,我们可以命名为 max525.c;实现fat32协议的驱动,我们可以命名fat32.c;忌出现 a.c、newfile.c、my.c、wang.c等无意义文件名。
文件名用小写字母、下划线、数字的组合命名,不可出现空格等其他字符,更不允许出现汉字、日语、俄语等非 ascii码的字符。
每个 .c文件都要对应有一个 .h 文件来配合其对外资源声明。 .h 文件内可包含宏定义、类型定义、对外资源(全局变量、全局函数)声明。 .c 文件可以包含变量声明、函数原型、函数体。为了防止重复调用,.h文件的逻辑开头需要加入开关控制,例如:
枚举体、宏、枚举体均需用大写字母、数字及下划线的组合,宏与常量之间用“tab”隔离,同一类含义的宏定义在一起,并放于相关的头文件中。宏定义以能表达清楚含义为标准,除专业术语外,推荐用完整单词表示宏含义。不同含义的宏定义需用空行分割,部分需加注释。例如:
我们可以用c关键字 typedef 进行自定义c语言中的数据类型。类型定义一般包括结构体、联合体类型定义及函数类型定义。ANSI C包含的数据类型(如unsigned char、unsigned short int、double 等),不建议重定义。
结构体、联合体类型定义推荐大写字母加 _T 的形式出现,例如:
函数命名采用谓宾结构,中间用下划线隔开,函数必须使用小写、数字及下划线的组合。不管函数原型声明还是函数体,必须包含完整的函数类型及参数类型(包括 void型亦不能省略)。文件的内部函数(不需要外部调用),需要在函数类型前加static 关键字。
函数原型声明时,需用注释的方式,添加函数调用参数的意义,例如:
大部分函数需返回函数执行状态,定义 0 为正常执行, -1为一般错误,-1 ~ -999为自定义错误。自定义错误可以通过宏或者变量实现。例如:
从逻辑功能划分的角度来讲,函数需要简、短、精,函数实现的逻辑内容要跟函数名要一一对应,不要超过函数名表达的范围,也不要只实现函数名所表达的部分功能。一般情况,尽量调用系统库来实现功能而不是自己去实现。
初始化变量一律用小写字母、数字及下划线实现,全局变量要体现变量的意义,需用单词的全写; 由于局部变量作用的范围,一般都在视野范围你,所以可以用简写及单个字母,如 i、a等。
全局变量尽量越少越好,并且需根据属性划分,以结构体形式体现为主。整个工程的全局变量需在头文件中用 extern 关键字对外声明,隶属于文件的全局变量(不属于整个工程的全局变量),需加 static 关键字修饰。
变量使用前必须初始化,初始化可以采用静态初始化和函数执行时初始化。结构体的初始化建议采用 c99 规范里的指定初始化。例如:
数组维数最好用宏定义,数组用时必须初始化(赋值或者清零),对数组维数判断时,需用sizeof 关键字,切忌直接用数字。
使用指针时,切忌指针越界及野指针的出现;指针也是个变量,用它之前也必须初始化。对CPU外设进行直接映射或者是中断内变量使用时,变量前需加 volatile 以防系统优化。
注释不宜过少,但也不宜过多。以表达清楚程序员的意图为最终目的,注释尽量不要用中文。函数体内注释,推荐采用 “//” 的注释方式。
每个文件头,均需加一个说明性的注释。例如:
每个函数体的开始,均需加一个说明性的注释。例如:
管理每个C工程中,可以以功能为依据对源文件进行文件夹分类。文件夹不可以出现空格、除英文字母、数字、下划线外的字符;更不允许出现汉字、俄语等非 ASCII码字符。例如某个工程可以划分为如下文件夹:
功能划分应以逻辑清晰、层次关系明显为目的。一旦划分好后,不可越级调用系统资源(例如只有driver内文件内直接操作硬件资源,其他文件夹代码均不可调用最底层硬件资源)。也不要互相调用而使系统资源很快耗尽。
文件一旦建立,就需在文件头说明文件目的、版权及历史记录,每次修改后必须记录。工程完工或者是间歇性搁置时,需要对所有工程文件夹、文件进行只读属性设置及当前状态记录(进行到什么状态、存在什么bug等)。对源代码最好做到每天一备份,以防意外篡改及丢失,以备恢复之用。
有很多优秀的代码编辑器可供大家选择,例如 Vim、Emacs、Souce-Insight、Edit-Plus等。每个人可以根据自己的喜好,选择一种编辑器,切忌滥用。
GCC (GNU Compiler Collection) 是一个非常优秀的编译器套装。他几乎在所有的操作系统下均有移植,并且有很多CPU的交叉编译器可供我们使用,例如 SDCC、arm-elf-gcc等。MS-Windows下推荐使用 Mingw32移植版,相应的集成开发环境推荐 Dev-cpp 和 Code::block。
《The C Programming Language》 c语言圣经;
《Advanced Programming in the UNIX Environment》 UNIX C 程序员圣经;
http://www.gnu.org GNU Operating System
http://www.sf.net Source Forge
http://www.kernel.net The Linux Kernel Archives
文章评论(0条评论)
登录后参与讨论