C++ : 代码编写规范(一)
目录
1 排版
1-1 缩进
1-2 独立说明加空行
1-3 字符 80+ 多行书写
1-4 较长语句进行划分
1-5 内嵌语句独占且加括号
1-6 空格对齐
1-7 操作符与空格
2 注释
2-1 说明文件
2-2 源文件
2-3 函数
2-4 数据结构
2-5 全局变量
2-6 相同缩排
2-7 代码接注释隔行
2-8 结束行右方注释
2-9 统一注释格式
3 标识符命名
3-1 缩写去“元音”
3-2 说明特殊内容
3-3 禁止单字符
3-4 成员 m、全局 g
3-5 反义词组成
4 可读性
4-1 标识替代数字
4-2 相邻紧密的代码
1 排版
1-1 缩进
程序块要采用缩进风格编写,缩进的空格数为 4 个
1-2 独立说明加空行
相对独立的程序块之间、变量说明之后必须加空行
示例:if (!valid_ni(ni))
{ ... // program code
} repssn_ind = ssn_data[index].repssn_index;
repssn_ni = ssn_data[index].ni;
1-3 字符 80+ 多行书写
较长语句(>80字符)分多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要适当缩进
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL ); act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index].occupied = stat_poi[index].occupied;report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)&& (n7stat_stat_item_valid (stat_item)) && (act_task_table[taskno].result_data != 0));
1-4 较长语句进行划分
循环、判断等语句中若有较长的表达式或语句,要进行适应划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首
示例:
if ((taskno < max_act_task_number) && (n7stat_stat_item_valid (stat_item)))
{ ... // program code
}
for (i = 0, j = 0; (i < BufferKeyword[word_index].word_length) && (j < NewKeyword.word_length); i++, j++)
{ ... // program code
} for (i = 0, j = 0; (i < first_word_length) && (j < second_word_length); i++, j++)
{ ... // program code
}
1-5 内嵌语句独占且加括号
if、for、do、while、case、switch、default 等语句自占一行,且 if、for、do、while 等的执行语句部分要加括号{ }
if (pUserCR == NULL)
{ return;
}
1-6 空格对齐
对齐只使用空格键,不使用TAB键。
// 说明:以免用不同的编辑器阅读程序时,因 TAB 键所设置的空格数目不同而造成程序布局
// 不整齐,不要使用 BC 作为编辑器合版本,因为 BC 会自动将 8 个空格变为一个 TAB 键,
// 因此使用 BC 合入的版本大多会将缩进变乱。
1-7 操作符与空格
在两个以上关键字、变量、常量对等操作时,之间的操作符之前、之后或前后加空格;非对等操作时,关系密切的立即操作符(如->)后不加空格
(1)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。
*p = 'a'; // 内容操作"*"与内容之间
flag = !isEmpty; // 非操作"!"与内容之间
p = &mem; // 地址操作"&" 与内容之间
i++; // "++","--"与内容之间(2)"->"、"."前后不加空格。
p->id = pid; // "->"指针前后不加空格(3) if、for、while、switch 等与后面的括号间应加空格,使 if 等关键字更为突出、明显。
if (a >= b && c > d)
2 注释
2-1 说明文件
说明性文件(.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应注释,必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,还应有函数功能简要说明。
/*************************************************** Copyright (C), Your Company File name: // 文件名Author: Version: Date: // 作者、版本及完成日期Description: // 用于详细说明此程序文件完成的主要功能,与其他模块// 或函数的接口,输出值、取值范围、含义及参数间的控// 制、顺序、独立或依赖等关系Others: // 其它内容的说明Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明1. .... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改// 者及修改内容简述 1. Date: Author: Modification: 2. ...
***************************************************/
2-2 源文件
源文件头部应注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。
/************************************************************ Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. FileName: test.cpp Author: Version : Date: Description: // 模块描述 Version: // 版本信息Function List: // 主要函数及其功能1. ------- History: // 历史修改记录<author> <time> <version > <desc> David 96/10/12 1.0 build this moudle
***********************************************************/
说明:Description 一项描述本文件的内容、功能、内部各部分之间的关系及本文件与
其它文件关系等。History 是修改历史记录列表,每条修改记录应包括修改日期、修改
者及修改内容简述
2-3 函数
函数头部应注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
/************************************************* Function: // 函数名称Description: // 函数功能、性能等的描述Calls: // 被本函数调用的函数清单Called By: // 调用本函数的函数清单Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)Input: // 输入参数说明,包括每个参数的作// 用、取值说明及参数间关系。Output: // 对输出参数的说明。Return: // 函数返回值的说明Others: // 其它说明
*************************************************/
2-4 数据结构
数据结构声明(数组、结构、类、枚举等),如果其命名不充分自注释则须加以注释。对数据结构的注释应放其上方;结构中每个域的注释放右方
示例:可按如下形式说明枚举/数据/联合结构。
/* sccp interface with sccp user primitive message name */
enum SCCP_USER_PRIMITIVE
{N_UNITDATA_IND, /* sccp notify sccp user unit data come */ N_NOTICE_IND, /* sccp notify user the No.7 network can not */ /* transmission this message */ N_UNITDATA_REQ, /* sccp user's unit data transmission request*/
};
2-5 全局变量
全局变量要有详细注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明
/* The ErrorCode when SCCP translate */
/* Global Title failure, as follows */ // 变量作用、含义
/* 0 - SUCCESS 1 - GT Table error */
/* 2 - GT error Others - no use */ // 变量取值范围
/* only function SCCPTranslate() in */
/* this modual can modify it, and other */
/* module can visit it through call */
/* the function GetGTTransErrorCode() */ // 使用方法
BYTE g_GTTranErrorCode;
2-6 相同缩排
注释与所描述内容进行同样的缩排。
void example_fun( void )
{ /* code one comments */ CodeBlock One /* code two comments */ CodeBlock Two
}
2-7 代码接注释隔行
将注释与其上面的代码用空行隔开
/* code one comments */
program code one /* code two comments */
program code two
2-8 结束行右方注释
在程序块的结束行右方加注释标记,以表明某程序块的结束
if (...)
{ // program code while (index < MAX_INDEX) { // program code } /* end of while (index < MAX_INDEX) */ // 指明该条 while 语句结束
} /* end of if (...)*/ // 指明是哪条 if 语句结束
2-9 统一注释格式
注释格式尽量统一,建议使用 /* …… */
3 标识符命名
3-1 缩写去“元音”
较短单词通过去掉“元音”形成缩写;较长单词取头几个字母形成缩写;一些有公认缩写
temp 可缩写为 tmp ;
flag 可缩写为 flg ;
statistic 可缩写为 stat ;
increment 可缩写为 inc ;
message 可缩写为 msg ;
3-2 说明特殊内容
命名中若使用特殊约定或缩写,则要有注释说明
3-3 禁止单字符
禁止取单字符(i、j、k),有具体含义外,还能表明变量类型、数据类型等,可作局部循环变量
int liv_Width;
/*其变量名解释如下:l 局部变量(Local) (其它:g 全局变量(Global)...)i 数据类型(Interger)v 变量(Variable) (其它:c 常量(Const)...)Width 变量含义*/
3-4 成员 m、全局 g
不用大小写与下划线混排,用作特殊标识如标识成员或全局变量的 m_ 和 g_ ,后加大小写混排的方式
示例: Add_User 不允许,add_user、AddUser、m_AddUser 允许。
3-5 反义词组成
用正确的反义词组命名具有互斥意义的变量或相反动作的函数等
/*add / move create / destory insert / deleteadd / delete first / last increment / decrementput / get get / release old / newstart / stop begin / end open / closemin / max lock / unlock next / previouscut / paste send / receive show / hideup / down source / target source / destination*/
4 可读性
4-1 标识替代数字
避免用不易理解的数字,用标识替代。涉及物理状态或含有物理意义的常量,用有意义的枚举或宏代替
示例:如下的程序可读性差。
if (Trunk[index].trunk_state == 0)
{ Trunk[index].trunk_state = 1; ... // program code
} 应改为如下形式。
#define TRUNK_IDLE 0
#define TRUNK_BUSY 1
if (Trunk[index].trunk_state == TRUNK_IDLE)
{ Trunk[index].trunk_state = TRUNK_BUSY; ... // program code
}
4-2 相邻紧密的代码
源程序中关系较为紧密的代码应尽可能相邻
rect.length = 10;
rect.width = 5; // 矩形的长与宽关系较密切,放在一起。
char_poi = str;