C语言编程规范10.docx
《C语言编程规范10.docx》由会员分享,可在线阅读,更多相关《C语言编程规范10.docx(27页珍藏版)》请在冰豆网上搜索。
C语言编程规范10
C编码规范
109条规则+49条建议
杨福田
1.文件结构(4条规则+6条建议)
C程序文件通常分为两类文件:
一类文件用于保存程序的声明(declaration),称为头文件。
头文件以“.h”为后缀。
另一类文件用于保存程序的实现(implementation),称为定义(definition)文件。
定义文件以“.c”为后缀。
对于简单的C语言程序,一般在把头文件和程序定义文件放在一起,只有一个.c定义文件即可。
而对于复杂的程序,则多采用头文件包含的形式并通过多个定义文件实现。
1.1版权和版本的声明
版权和版本的声明一般应该位于头文件和定义文件的开头(参见示例1-1),主要内容包括:
(1)版权信息;
(2)文件名称、文件标识、摘要;
(3)当前版本号、作者/修改者、修改日期、修改描述等;
(4)版本历史信息、原作者、完成日期等。
/*
*Copyright(c)2008,上海海同信息科技有限公司
*Allrightsreserved.
*
*文件名称:
filename.h
*文件标识:
根据软件工程设置
*摘要:
简要描述本文件的作用和内容等
*/
//下面其它的声明代码
…
//下面是原作者、版本、完成、日期和当前版本的信息
/*当前版本:
1.0.1
*作者:
修改者名字,修改日期:
2005年4月5日
*修改的地方描述:
*/
/*
*取代版本:
1.0.0
*原作者:
原作者名字,完成日期:
2004年12月31日
*/
示例1-1版权和版本的声明
版本标识:
采用<主版本号>.<次版本号>.<修订号>来命名自己产品的编号。
一般这样约定,如果次版本号是偶数(如0、2、4等),代表正式版本,如果次版本号是奇数(如1、3、5等),代表开发过程中的测试版本。
修订号则相当于Build号,用来标识一些小的改动。
1.2头文件的结构
头文件由三部分内容组成:
(1)文件开头处的版权和版本声明(参见示例1-1);
(2)预处理块;
(3)声明函数原型和声明数据结构或变量等。
假设头文件名称为filename.h,头文件的结构参见示例1-2。
/*
*Copyright(c)2004,北大青鸟培训中心
*Allrightsreserved.
*
*文件名称:
filename.h
*文件标识:
根据软件工程设置
*摘要:
简要描述本文件的作用和内容等
*/
#include
#include
#include//引用头文件
structstudentstruct
{
intno;
charname[20];
charsex;
floatscore;
};
voidGetValue()
{
}
voidSetValue(intno)
{
}
//后面同示例1-1。
示例1-2C头文件结构
1.3定义文件的结构
定义文件有三部分内容:
(1)定义文件开头处的版权和版本声明(参见示例1-1);
(2)对一些头文件的引用;
(3)程序的实现体(包括数据和代码)。
假设定义文件的名称为filename.c,定义文件的结构参见示例1-3
/*版权和版本声明见示例1-1,此处省略。
*/
#inlcude“filename.h”
#ifndefGRAPHICS_H//防止graphics.h被重复引用
#defineGRAPHICS_H
/*函数的实现体*/
voidGetValue()
{
…
}
/*函数的实现体*/
voidSetValue(intno)
{
…
}
voidmain()
{
…
}
示例1-3C定义文件的结构
1.4头文件和定义文件使用(4条规则+6条建议)
【规则1-2-1】在复杂的工程文件中,为了防止头文件被重复引用,应使用ifndef/define/endif结构产生预处理块。
【规则1-2-2】用#include格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则1-2-3】用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【规则1-2-4】只引用必需的头文件,不要为了防止忘记包含头文件而在每个文件开始添加很多的头文件。
【建议1-2-1】不要在头文件中定义常量或变量,注意头文件只是用来声明。
【建议1-2-2】不提倡使用全局变量,尽量不要在头文件中出现像“externintwidth;”这类声明。
【建议1-2-3】将非系统的函数库放在一个单独的目录下引用。
【建议1-2-4】头文件应按功能组织在一起,即对单独子系统的声明应放在单独的头文件中。
此外,当代码从一个平台移植到另一个平台时有可能发生更改的声明应位于单独的头文件中,并进行相应的注释。
【建议1-2-5】避免使用与函数库中专用头文件名相同的头文件名。
语句#include"math.h"如果在当前目录中找不到所期望文件的话,会包括标准库math头文件。
【建议1-2-6】包含头文件时一般不使用绝对路径名。
2.程序版式(35条规则+2条建议)
2.1空行(4条规则)
空行起着分隔程序段落的作用,空行得体将使程序的布局更加清晰。
空行不会浪费内存,所以不要舍不得用空行。
【规则2-1-1】在函数内部局部变量定义结束之后处理语句之前要加空行。
【规则2-1-2】在每个函数定义结束之后都要加空行。
参见示例2-1(a)。
【规则2-1-3】函数返回语句和其他语句之间使用空行分开。
【规则2-1-4】在一个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应加空行分隔。
参见示例2-1(b)。
示例2-1(a)函数之间的空行示例2-1(b)函数内部的空行
2.2代码行(5条规则+1条建议)
【规则2-2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。
这样的代码容易阅读,并且方便写注释。
【规则2-2-2】if、for、while、do等语句自占一行,执行语句不得紧跟其后。
不论执行语句有多少都要加{}表明是一个语句块。
【规则2-2-3】一对花括号要单独各占一行。
但是在do-while、struct和union及其后有‘;’的除外,要同在一行。
例如:
do
{
…
}while(i>0);
【规则2-2-4】switch语句中的每个case语句各占一行,当某个case语句不需要break语句最好加注释声明。
【规则2-2-5】并列的语句行应该按照字母顺序排序,如变量定义和switch中的case语句等。
【建议2-2-1】尽可能在定义变量的同时初始化该变量(就近原则),如果变量的引用处和其定义处相隔较远,变量的初始化很容易被忘记。
如果引用了未被初始化的变量,可能会导致程序错误。
本建议可以减少隐患。
例如:
intwidth=20;/*定义并初绐化width*/
intheight=20;/*定义并初绐化height*/
intdepth=20;/*定义并初绐化depth*/
风格良好的代码行
风格不良的代码行
intwidth;/*宽度*/
intheight;/*高度*/
intdepth;/*深度*/
intwidth,height,depth;/*宽度高度深度*/
x=a+b;
y=c+d;
z=e+f;
x=a+b;y=c+d;z=e+f;
if(width{
dosomething();
}
if(widthfor(initialization;condition;update)
{
dosomething();
}
//空行
other();
for(initialization;condition;update)
dosomething();
other();
2.3代码行内的空格(6条规则+1条建议)
【规则2-3-1】关键字之后要留空格。
象const、case等关键字之后至少要留一个空格,否则无法辨析关键字。
象if、for、while等关键字和紧跟的左括号‘(’之后应留一个空格,右括号前也对应要留一个空格,以突出关键字。
例如:
if(a==b)
【规则2-3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
例如:
voidcalc(void);
【规则2-3-3】“,”之后要留空格,如Function(x,y,z)。
如果‘;’不是一行的结束符号,其后要留空格,如for(initialization;condition;update)。
【规则2-3-4】不要在单目运算符(如“!
”、“~”、“++”、“--”、“&”)和其操作对象间加空格。
例如:
!
foo,++i,(long)getValue
【规则2-3-5】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”、“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
【规则2-3-6】象“[]”、“.”、“->”这类操作符前后不加空格。
例如:
big.bar,pFile->bar,big[bar]
【建议2-3-1】对于表达式较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格.
例如:
for(i=0;i<10;i++)和if((a<=b)&&(c<=d))
风格良好的空格
风格不良空格
voidFunc1(intx,inty,intz);
voidFunc1(intx,inty,intz);
if(year>=2000)
if((a>=b)&&(c<=d))
if(year>=2000)
if(a>=b&&c<=d)
for(i=0;i<10;i++)
for(i=0;i<10;i++)
for(i=0;i<10;i++)
x=a
a:
b;
x=a
a:
b;
int*x=&y;
int*x=&y;
array[5]=0;
a.Function();
b->Function();
array[5]=0;
a.Function();
b->Function();
2.4对齐(4条规则)
【规则2-4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则2-4-2】水平缩进每次使用四个空格即可(定义一个tab键为四个空格。
有的要求缩进两个空格)。
【规则2-4-3】同属于一个语句块的代码对齐。
【规则2-4-4】{}之内的代码块在‘{’右边一个tab键处左对齐。
风格良好的对齐
风格不良的对齐
voidFunction(intx)
{
programcode
}
voidFunction(intx){
programcode
}
if(condition)
{
programcode
}
else
{
programcode
}
if(condition){