个人编码模板
—c/c++语言编程模板
代码总体原则:
<1>清晰第一
清晰性是易于维护,易于重构的程序必须具备的特征。
<2>简洁为美
简洁就是易于理解并且易于实现,废弃的代码及时清除,重复的代码应该尽可能提炼成函数。
<3>选择合适的风格,与代码原有的风格保持一致
如果重构/修改其他风格 的代码时,比较明智的做法是根据现有代码的现有风格继续编写代码。
程序排版:
1.程序块要采用缩进风格进行编写,缩进的空格数为4.
2.较长的语句(>80字符)要分成多行书写。
3.循环、判断等语句中若有较长的表达式或者语句,则要进行适当的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
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
}
4.不允许把多个短语句写在一行中,即一行只写一条语句。如下则不符合规范。
Int a=0; int b=0;
5.If,for,do,while,case,switch,default语句自成一行时,则if,do,while,for语句等执行语句部分无论多少都要加括号{}。
6.函数或过程的开始,结构的定义及循环和判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求。
注释:
1.一般情况下,源程序有效注释量必须在20%以上。
说明:注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
2.注释的内容要清楚、明了,含义准确,防止注释二义性。
说明:有歧义的注释反而会导致维护者更难看懂代码,正如带两块表反而不知道准确时间。
3.修改代码时,维护代码周边的所有注释,以保证注释与代码的一致性。
说明:不再有用的注释要删 除。 说明:不要将无用的代码留在注释中,随时可以从源代码配置库中找回代码;即使只是想暂时排除代 码,也要留个标注,不然可能会忘记处理它。
4.文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者姓名、工号、内 容、功能说明、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。
说明:通常头文件要对功能和用法作简单说明,源文件包含了更多的实现细节或算法讨论。 版权声明格式:Copyright © Huawei Technologies Co., Ltd. 1998-2011. All rights reserved. 1998-2011根据实际需要可以修改, 1998是文件首次创建年份,而2011是最新文件修改年份。
示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/************************************************* Copyright © Huawei Technologies Co., Ltd. 1998-2011. All rights reserved.
File name: // 文件名
Author: ID:Version: Date: // 作者、工号、版本及完成日期
Description: // 用于详细说明此程序文件完成的主要功能,与其他模块
// 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系
Others: // 其它内容的说明
History: // 修改历史记录列表,每条修改记录应包括修改日期、修改
// 者及修改内容简述
5.注释应放在其代码上方相邻位置或右方,不可放在下面。如放于上方则需与其上面的代码用 空行隔开,且与下方代码缩进相同。 示例:
/* active statistic task number */
#define MAX_ACT_TASK_NUMBER 1000
#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */
可按如下形式说明枚举/数据/联合结构。
/* 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*/
};
6.避免在一行代码或表达式的中间插入注释。
说明:除非必要,不应在代码或表达中间插入注释,否则容易使代码可理解性变差。
7.在代码的功能、意图层次上进行注释,即注释解释代码难以直接表达的意图,而不是重复描 述代码。
说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码, 防止没必要的重复注释信息。对于实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。注释不是为了名词解释(what),而是说明用途(why)。
示例:如下注释纯属多余。
++i; /* increment i */
if (receive_flag) /* if receive_flag is TRUE */
其他:
1.头文件
1.1禁止头文件循环依赖
1.2.c/.h文件禁止包含用不到的头文件
1.3禁止在头文件中定义变量
2.函数
2.1一个函数仅完成一个功能
2.2 重复代码应该尽可能提炼成函数
重复代码提炼成函数可以带来维护成本的降低。
2.3废弃代码(没有被调用的函数和变量)要及时清除。
2.4 函数的参数个数不超过5个
函数的参数过多,会使得该函数易于受外部(其他部分的代码)变化的影响,从而影响维护工 作。函数的参数过多同时也会增大测试的工作量。
3.标识符命名与定义
通用命名规则
单词用小写字母,每个单词直接用下划线„_‟分割,例如text_mutex, kernel_text_address。
3.1 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写, 避免使人产生误解。好的命名:int error_number,不好的命名:使用随意的字符。如int nerr。
3.2除了常见的通用缩写以外,不使用单词缩写,不得使用汉语拼音。较长的单词可取单词的头几个字母形成缩写,一些 单词有大家公认的缩写,常用单词的缩写必须统一。
举例:argument 可缩写为 arg
clock 可缩写为 clk
configuration 可缩写为 cfg
maximum 可缩写为 max
minimum 可缩写为 min
temp 可缩写为 tmp
3.3 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
add/remove begin/end create/destroy
insert/delete first/last get/release increment/decrement put/get add/delete
实例模板:
//文件名:顺序表插入及求表长.cpp
//作者: Vector_山水之间
//学号:1508010333
//版本:20160506.1.0
//完成日期:2016.5.6
//主要功能:完成顺序表的 插入和求表长的操作
#include<stdio.h>
#define MAXSIZE 100
typedef int ElemType;
typedef struct //定义顺序表结构
{
<span style="white-space:pre"> </span>ElemType list[MAXSIZE];
int last;
}SeqList;
void InitList(SeqList *L) //定义初始表的函数
{
L->last=-1;
}
void PutseqList(SeqList *L,int n) //定义初始输出函数
{
int i;
for(i=0;i<n;i++)
scanf("%d",&(L->list[i]));
L->last=L->last+n;
}
int LengthList(SeqList *L) //定义求表长的函数
{
<span style="white-space:pre"> </span>int Len;
Len=L->last+1;
return Len;
}
int PositionList(SeqList *L,int X) //定义位置确认函数
{
int j;
for(j=0;j<=L->last;j++)
if(X<L->list[j])
<span style="white-space:pre"> </span>return j+1;
return (L->last+2);
}
int InsertList(SeqList *L,int i,int e) //定义插入函数
{
int k;
if((i<1)||(i>L->last+1))
{
printf("插入位置不合理");
return 0;
}
if(L->last>=MAXSIZE-1)
{
printf("表已满无法插入");\
return 0;
}
for(k=L->last;k>=i-1;k--)
L->list[k+1]=L->list[k];
L->list[i-1]=e;
L->last++;
return 1;
}
//定义经过插入操作后的输出函数
int OutputSeqList(SeqList *L) //定义经过插入操作后的输出函数函数
{
int i;
printf("输出结果为:");
for(i=0;i<=L->last;i++)
printf("%d ",L->list[i]);
return(L->list[i]);
}
int main() //主函数
{
int s,c;
SeqList L;
InitList(&L);
printf("请输入顺序表长度:");
scanf("%d",&s);
printf("请输入递增顺序表:");
PutseqList(&L,s);
LengthList(&L);
printf("表长为%d\n",LengthList(&L));
printf("请输入要插入的元素:");
scanf("%d",&c);
InsertList(&L,PositionList(&L,c),c);
OutputSeqList(&L);
printf("\n");
return 0;
}