当前位置: > 华清远见教育科技集团 > 嵌入式学习 > 讲师博文 > C编码规范
C编码规范
时间:2016-12-14作者:华清远见

为什么需要编码规范?

见过 很多C语言的初学者写的代码,他们并不懂什么是好的编码 风格,写出来的代码风格各异。有的风格极易导致错误,有的风格让人难以理解,有的风格让人眼花缭乱,有的风格甚至连作者自己都不知道写代码那会自己到底在想什么。

良好的编码风格,并不是官僚制度下产生的浪费大家时间的制度。统一的编码风格,可以让别人很容易理解代码意图,进而快速使用和二次开发,大大节约开发时间。并且极大的简化了代码维护,减少了维护成本。

良好的编码风格,可以让程序员避免一些细节上的缺失。虽然这些东西可能很细微,但若你不注意这些细节,那可能会给整个软件的质量带来极大的影响,所谓“千里之堤毁于蚁穴”。

很多大公司,例如google,华为,腾讯等,都会在新员工入职培训的阶段培训编程标准。每个员工都必须遵循公司内部制定的编程标准。程序就像一个作品,有素质有修养的程序员的作品必然是一图精美的图画,一首美妙的歌曲,一本赏心悦目的小说。

如何编写代码

注释

注释是源码中非常重要的部分,通常源程序中的注释量必须在15%~20%以上。注释的原则是有助于程序的阅读和理解。所以注释语言必须准确,易懂,简洁。注释不宜过多,也不宜太少。

文件或者模块的注释

对于一个文件或模块注释,应该有文件名称,生成日期,作者名字,模块描述,版本编号,修改记录等。例如:

/****************************************
        * name: //文件名称
        * Date: //创建日趋
        * Description: //详细描述此程序文件 * 主要功能,以及与其他文 * 件的关系
        * Author: //文件作者
        * Version: //文件版本号。
        * Modification: // 描述该文件修改日志
        *****************************************/

2.函数的注释

对于函数,我们需要标注的内容主要是:函数名称,参数说明,功能描述,返回值说明等。例如:

/***************************************************
        *Function name: //函数名称
        * Description: //函数功能描述
        *Inputs: //函数参数描述
        * Outputs: //函数返回值描述
        *Author: //函数作者
        *Other: //函数其他说明
        ***************************************************/

3.其他的注释

i. 边写代码边注释,对于具有一定含义的变量、常量、数据结构以及相关算法,若其名称不能充分说明其用途或需要添加额外的说明,都必须进行注释。

ii. 注释一般位于需要注释的语句相邻的上方或者右方。禁止在代码的下方写注释。

iii. 将注释与其上面的代码用空行间隔。

iv. 注释的格式尽量一致,建议使用/*..........*/

二、代码的排版

良好的排版是优秀代码风格的关键。以下是代码排版需要主动的事项。

1.程序块要采用缩进风格编写,缩进的空格数是4个

2.相对独立的代码块之间,变量的说明之后,必须加入空行。

例如:

if ( ! is_empty(list)))
        {
                .................// code
        }

        Pop_list(list);

3.较长的语句要分成多行书写。循环、判断等语句中若有较长的表达式或语句,要进行适当的划分。

4.不允许把多个短语句写在一行中,一行只写一条语句。

例如:

rect.length = 0;

rect.width = 0;

5.if,for,do,while,case,switch,default等独占一行,且其中语句部分无论几行都需要加{}。

6.注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

三、标识符命名

标识符的命名要清晰,有明确含义。使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

1.常量命名使用大写 例如 :MAX_VALUE

2.变量命名禁止取单个字符,建议除了要有具体含义外,还能表明存储类型、数据类型等,但是i,j,k作为局部不循环变量是可以的。

变量命名可以采用匈牙利命名法 ,变量的第一个字母小写,

表示其数据类型,如 int iIndex; char cIndex;

也可以采用linux通用的命名规范,采用‘_’分割短语命名一个变量,例如一个变量保存图书数目,可以命名为

int number_book;

下列所示的局部变量方法可以借鉴:

int liv_width;

其解释如下:

l        局部变量(local)
        i        数据类型(Integer)
        v        变量(Variable)
        width        变量含义

3.标示符的风格要自始至终保持一致,不可来回变换。

4.避免不易理解的数字,要用有意义的宏来代替。例如:

#define MAX 128

四、宏

1.用宏定义表达式的时候,要使用完备的括号。例如:

#define MAX(a,b) a > b ? a : b
        应该定义为:#define MAX(a,b) (a) > (b) ? (a) : (b)
        #define RECTANGLE_AREA( a,b) ( a * b )
        应该定义为:#define RECTANGLE_AREA(a,b) ((a) * (b))

2.使用宏的时候,不允许参数发生变化。例如:

如下用法会产生错误:

#define SQUARE(a) ((a) * (a))
        Int a = 5;
        Int b = SQUARE(a++)
        宏扩展之后,或许会让你意想不到结果是30。
        扩展后的表达式是:((a++) * (a++))
        正确的写法应该是:
        b = SQUARE(a);
        a++; // a++ 只执行了一次

3.将常量声明为宏,防止代码中的硬编码。

比如:int user[100];

谁也不知道100到底表示什么含义,你可以定义一个宏来表示其含义,比如大用户数量MAX_USER。若程序中突然出现for(i = 0;i < 100;i++)这样的代码,你或许根本不知道100表示什么含义。再或者你要改变这个值,100出现几次就需要修改几个位置 ,这就是硬编码带来的后果。

4.头文件中的预编译

当多个文件同时包含一个头文件的时候,#ifndef是个很关 键的东西。它能避免重复包含头文件所带来的命名冲突。

一般的格式如下:

在/fad/cde.h文件中

#ifndef FAD_CDE_H
        #define FAD_CDE_H
        .....
        #endif

五、函数

1.对于所调用的函数的错误返回码,要进行仔细,全面的处理。

2.函数的规模尽量限制在200行以内。

3.一个函数仅完成一件事情,多功能的函数,可能会使函数的理解、测试、维护变得困难。

4.检查所有参数输入的有效性,可以使用断言。

六、头文件和源文件

一般来说,头文件中是声明,源文件中是定义。源文件要编译成库文件,若别人要使用你的函数,就要引用你的头文件,所以头文件一般是变量、宏定义、枚举、结构和函数接口的声明,源文件则是实现的细节。

头文件和源文件大的用处就是声明和实现分开。直接把函数实现写到头文件中是很不好的习惯。

发表评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)