CC语言代码编写规范Word文档格式.doc
《CC语言代码编写规范Word文档格式.doc》由会员分享,可在线阅读,更多相关《CC语言代码编写规范Word文档格式.doc(49页珍藏版)》请在冰点文库上搜索。
A.3变量、结构与数据类型 20
A.4常量 25
A.5函数 26
A.6宏 30
A.7程序效率 31
A.8可测性 35
A.9质量保证 38
A.10代码编辑、编译、审查 43
前言
本标准的附录A为资料性附录。
本标准由许继电气股份有限公司提出。
本标准由许昌继电器研究所归口。
本标准起草单位:
许继保护及自动化事业部、科研处、北京许继电气有限公司、珠海许继电气有限公司、深圳市许继昌达电网控制设备有限公司。
本标准主要起草人:
张新昌、包伟、杨智德、李江林、李旺、王若醒、刘彬、王伟东。
II
C/C++语言编程规范
1 范围
本标准规定了软件编程中程序文件的结构和编程风格方面的一些规则。
本标准适用于C/C++编程。
2 规范性引用文件
下列文件中的条款通过本标准的引用而成为本标准的条款。
凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本标准,然而,鼓励根据本标准达成协议的各方研究是否可使用这些文件的最新版本。
凡是不注日期的引用文件,其最新版本适用于本标准。
GB/T5271.1-2000信息技术词汇第1部分:
基本术语
GB/T5271.7-1986数据处理词汇07部分:
计算机程序设计
GB/T5271.15-1986数据处理词汇15部分:
程序设计语言
3 术语和定义
GB/T5271.1-2000、GB/T5271.7-1986和GB/T5271.15-1986确立的术语和定义适用于本标准。
4 文件结构
4.1 概述
每个C/C++程序应至少包括两类文件。
一个文件用于保存程序的声明,称为头文件。
另一个文件用于保存程序的实现,称为定义文件。
C/C++程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀,C++程序的定义文件通常以“.cpp”为后缀(也有一些系统以“.cc”或“.cxx”为后缀)。
4.2 版权和版本的声明
/*
*Copyright(c)2001,许继集团有限公司
*Allrightsreserved.
*
*文件名称:
filename.h
*摘要:
简要描述本文件的内容
*
*版本号:
1.2作者:
作者(修改者)完成日期:
2003年7月20日
1.1作者:
2003年5月20日
1.0作者:
2003年2月20日
*/
图1 版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头(见图1),主要内容有:
——版权信息;
——文件名称,摘要;
——当前版本号,作者/修改者,完成日期;
——版本历史信息。
4.3 头文件的结构
4.3.1 概述
头文件由三部分内容组成:
——头文件的版权和版本声明(见图1);
——预处理块;
——函数和类结构声明等。
若头文件名称为graphics.h,头文件的结构见图2。
//版权和版本声明见图1
#ifndef GRAPHICS_H //防止graphics.h被重复引用
#define GRAPHICS_H
#include<
math.h>
//引用标准库的头文件
…
#include“myheader.h” //引用非标准库的头文件
voidFunction1(…);
//全局函数声明
classBox //类结构声明
{
};
…//其它
#endif
图2 C/C++头文件的结构
4.3.2 为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
4.3.3 用#include<
filename.h>
格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
4.3.4 用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
4.3.5 头文件中宜只存放“声明” 而不存放“定义”。
4.3.6 不提倡使用全局变量,不宜在头文件中出现externintvalue这类声明。
4.4 定义文件的结构
定义文件有三部分内容:
——定义文件的版权和版本声明(见图1);
——对一些头文件的引用;
——程序的实现体(包括数据和代码)。
若定义文件的名称为graphics.cpp,定义文件的结构见图3。
#include“graphics.h” //引用头文件
//全局函数的实现体
voidFunction1(…)
}
//类成员函数的实现体
voidBox:
:
Draw(…)
图3 C/C++定义文件的结构
5 程序的版式
5.1 空行
5.1.1 在变量声明之后、每个类声明之后和每个函数定义结束之后应加空行(见图4(左))。
5.1.2 在一个函数体内,逻辑上密切相关的语句之间应不加空行,其它地方应加空行分隔(见图4(右))。
//空行
…
voidFunction2(…)
voidFunction3(…)
while(condition)
statement1;
//空行
if(condition)
{
statement2;
}
else
statement3;
statement4;
}
图4 函数之间的空行(左),函数内部的空行(右)
5.2 代码行
5.2.1 一行代码宜只做一件事情,如只定义一个变量,或只写一条语句(见图5)。
5.2.2 if、for、while、do等语句应自占一行,执行语句不应紧跟其后。
不论执行语句有多少都应加‘{}’(见图5)。
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<
height)
dosomething();
height)dosomething();
for(initialization;
condition;
update)
other();
图5 风格良好的代码行(左),与风格不良的代码行(右)
5.2.3 尽可能在定义变量的同时初始化该变量。
若变量的引用处与其定义处相隔比较远,变量的初始化易被忘记。
若引用了未被初始化的变量,易导致程序错误。
示例:
intwidth=10;
//定义并初绐化width
intheight=10;
//定义并初绐化height
intdepth=10;
//定义并初绐化depth
5.3 代码行内的空格
voidFunc1(intx,inty,intz);
//良好的风格
voidFunc1(intx,inty,intz);
//不良的风格
if(year>
=2000)//良好的风格
if(year>
=2000)//不良的风格
if((a>
=b)&
&
(c<
=d))//良好的风格
if(a>
=b&
c<
=d)//不良的风格
for(i=0;
i<
10;
i++)//良好的风格
for(i=0;
i<
i++)//不良的风格
for(i=0;
I<
10;
i++)//过多的空格
x=a<
b?
a:
b;
//良好的风格
x=a<
b?
a:
b;
//不好的风格
int*x=&
y;
//良好的风格
int*x=&
y;
//不良的风格
array[5]=0;
//不应写成array[5]=0;
a.Function();
//不应写成a.Function();
b->
Function();
//不应写成b->
Function();
图6 代码行内的空格
5.3.1 关键字之后应留空格。
如if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
5.3.2 函数名之后应不留空格,紧跟左括号‘(’,以与关键字区别。
5.3.3 ‘(’后面应不留空格,‘)’、‘,’、‘;
’前面应不留空格。
5.3.4 ‘,’之后应留空格,如Function(x,y,z)。
若‘;
’不是一行的结束符号,其后应留空格,如for(initialization;
update)。
5.3.5 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>
=”、“<
=”、“+”、“*”、“%”、“&
”、“||”、“<
<
”,“^”等二元操作符的前后应加空格。
5.3.6 一元操作符如“!
”、“~”、“++”、“--”、“&
”(地址运算符)等前后应不加空格。
5.3.7 “[]”、“.”、“->
”等操作符前后应不加空格。
注:
对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;
i++)和if((a<
=d))
5.4 对齐
voidFunction(intx)
…//programcode
voidFunction(intx){
if(condition)
else
if(condition){
else{
update){
While(condition)
while(condition){
若出现嵌套的{},则使用缩进对齐,如:
…
{
…
}
…
图7 风格良好的对齐(左),与风格不良的对齐(右)
5.4.1 程序块应采用缩进风格编写,缩进的空格数为4个。
对于由开发工具自动生成的代码可以有不一致。
5.4.2 对齐只使用空格键,不使用TAB键。
以免用不同的编辑器阅读程序时,因TAB键所设置的空格数目不同而造成程序布局不整齐,不应使用BC作为编辑器合版本,因为BC会自动将8个空格变为一个TAB键,因此使用BC合入的版本大多会将缩进变乱。
5.4.3 程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
(见图7)
5.4.4 在函数体的开始、类的定义、结构的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
(见图8)
for(...)
...//programcode
if(...)
voidexample_fun(void)
for(...){
{
}
图8 风格良好的分界(左),与风格不良的分界(右)
5.5 长行拆分
5.5.1 代码行最大长度宜控制在120个字符以内。
5.5.2 长表达式宜在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。
拆分出的新行应进行适当的缩进,使排版整齐,语句可读(见图8)。
if((very_longer_variable1>
=very_longer_variable12)
(very_longer_variable3<
=very_longer_variable14)
(very_longer_variable5<
=very_longer_variable16))
dosomething();
virtualCMatrixCMultiplyMatrix(CMatrixleftMatrix,
CMatrixrightMatrix);
for(very_longer_initialization;
very_longer_condition;
very_longer_update)
dosomething();
图9 长行的拆分
5.5.3 若函数或过程中的参数较长,则要进行适当的划分。
n7stat_str_compare((BYTE*)&
stat_object,
(BYTE*)&
(act_task_table[taskno].stat_object),
sizeof(_STAT_OBJECT));
n7stat_flash_act_duration(stat_item,frame_id
*STAT_TASK_CHECK_NUMBER+index,stat_object);
图10 参数的拆分
5.5.4 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;
进行非对等操作时,如果是关系密切的立即操作符(如->
),后不应加空格。
采用这种松散方式编写代码的目的是使代码更加清晰。
由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。
在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。
给操作符留空格时不要连续留两个以上空格。
5.6 注释
5.6.1 概述
注释分为序言性注释和功能性注释:
——序言性注释通常置于每一个程序模块的开头部分,给出程序的整体说明,对于理解程序具有引导作用;
——功能性注释嵌在源程序体中,用以描述其后的语句或程序段在做什么工作。
5.6.2 注释行的数量不得少于整个源程序的1/10。
5.6.3 单行注释原则上不得超过可视窗口宽度。
5.6.4 若代码本来就是清楚的,则不必加注释。
i++;
//i加1,多余的注释
5.6.5 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
不再有用的注释应删除。
在存档的某一版本的源代码中不得存在由于调试而留下的大篇注释。
5.6.6 注释应当准确、易懂,防止注释有二义性。
5.6.7 尽量避免在注释中使用缩写,特别是不常用缩写。
5.6.8 注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
(见图11)
5.6.9 在同一函数或模块中的注释应尽量对齐,如下例所示:
BOOLbReturnCache;
//是否将Cache中的内容返回客户端
HANDLEFileToWrite;
//用来写数据的文件
DWORDBytesWritten;
//写入的数据长度
/*getreplicatesubsystemindexandnetindicator*/
repssn_ind=ssn_data[index].repssn_index;
repssn_ni=ssn_data[index].ni;
例1:
例2:
图11 风格良好的注释(左),与风格不良的注释(右)
5.6.10 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读(见图12)。
*函数介绍:
*输入参数:
*输出参数:
*返回值:
voidFunction(floatx,floaty,floatz)
if(…)
while(…)
{
}//endofwhile
}//endofif
图12 程序的注释
5.6.11 注释与所描述内容进行同样的缩排。
可使程序排版整齐,并方便注释的阅读与理解。
如下例子,排版不整齐,阅读不方便。
/*codeonecomments*/
CodeBlockOne
/*codetwocomments*/
CodeBlockTwo
应改为如下布局。
/*codeonecomments*/
/*codetwocomments*/
5.6.12 将注释与其上面的代码用空行隔开。
如下例子,显得代码过于紧凑。
programcodeone
/*codetwocomments*/
programcodetwo
应如下书写
5.6.13 函数注释(序言性注释)
5.6.13.1 单元文件宜不超过1000行(包括注释),复杂的组件单元可以不受此限制.
5.6.13.2 每个函数或过程代码必须有注释文字,每个函数体中,每一小功能段都应有注释。
5.6.13.3 函数定义之前必须有对整个函数的描述,注释格式如下
/*****************************************************************************
【函数名称】(必需)
【函数功能】(必需)
【参数】(若有参数则必需注明)
【全局变量】(可选)
【返回值】(若有返回值则必需注明)
【备注】(可选)
【开发者及日期】(若与头文件注释中的开发者为不同的人,则必需注明)
【版本】(若与头文件注释中的版本不同,则必需注明)
【更改记录】(若有修改,则必需注明)
[最后修改]
[修改日期]
更改原因概要
[版本]
【使用情况】(可选)
*****