实验室内部C语言编程规范V10.docx
- 文档编号:9141709
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:27
- 大小:30.77KB
实验室内部C语言编程规范V10.docx
《实验室内部C语言编程规范V10.docx》由会员分享,可在线阅读,更多相关《实验室内部C语言编程规范V10.docx(27页珍藏版)》请在冰豆网上搜索。
实验室内部C语言编程规范V10
实验室内部C语言编程规范
文件状态
文件标识:
[]草稿文件
当前版本:
V1.0
[√]正式文件
作者:
徐平
[]更新文件
完成日期:
2009-11-17
完成地点:
杭州电子科技大学自动化学院
版本历史
版本
状态
作者
时间
备注
V0.8
草稿文件
徐平
2009-11-5~2009-11-8
徐平起草
V0.9
草稿文件
徐平
2009-11-9~2009-11-12
朱滔修改,徐平补充
V1.0
正式文件
徐平
2009-11-12~2009-11-17
朱滔增加typedef.h,
徐平补充
目录
第1章文件结构-------------------------------------------------------------------------------3
第2章程序排版-------------------------------------------------------------------------------6
第3章注释------------------------------------------------------------------------------------11
第4章命名规则------------------------------------------------------------------------------13
第5章常量、变量和结构------------------------------------------------------------------15
第6章基本语句------------------------------------------------------------------------------19
第7章函数------------------------------------------------------------------------------------22
第8章内存管理------------------------------------------------------------------------------25
附录----------------------------------------------------------------------------------------------26
参考文献----------------------------------------------------------------------------------------27
第1章文件结构
每个C程序通常分为两个文件。
一个文件用于保存程序的声明(declaration),
称为头文件,另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。
C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀。
1.1版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头(参见示例1-1),主要内容有:
(1)版权信息;
(2)文件名称,作者,当前版本号,完成日期,文件功能描述;
(3)版本历史信息。
/*************************************************************************
Copyright(C),2009-2010,CollegeofAuto.HangzhouDianziUniv.
Filename:
filename.c
Author:
xuping
Version:
1.0
Date:
2009-11-5
Description:
//用于详细说明此程序文件完成的主要功能,与其他模块
//或函数的接口,输出值、取值范围、含义及参数间的控
//制、顺序、独立或依赖等关系
Others:
//其它内容的说明
History:
//修改历史记录列表,每条修改记录应包括修改日期、修改
//者及修改内容简述
1.Author:
Date:
Modification:
2.Author:
Date:
Modification:
…
*****************************************************************************/
示例1-1版权和版本的声明
1.2头文件的结构
头文件由三部分内容组成:
1)头文件开头处的版权和版本声明;
2)预处理块;
3)函数和结构声明等。
假设头文件名称为filename.h,头文件的结构参见示例1-2。
//版权和版本声明见示例1-1,此处省略。
#ifndefFILENAME_H//防止filename.h被重复引用
#defineFILENAME_H
#include
…
#include“myheader.h”//引用非标准库的头文件
…
voidfunction(…);//函数声明
…
structBOX_STRU//结构声明
{
…
}BOX;
#endif
示例1-2头文件的结构
【规则1-1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
【规则1-2】用#include
【规则1-3】用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【建议1-1】头文件中只存放“声明”而不存放“定义”。
【建议1-2】不提倡使用全局变量,尽量不要在头文件中出现象externintvalue这类声明。
1.3定义文件的结构
定义文件有三部分内容:
1)定义文件开头处的版权和版本声明(参见示例1-1);
2)对一些头文件的引用;
3)程序的实现体(包括数据和代码)。
假设定义文件的名称为filename.h,定义文件的结构参见示例1-3。
//版权和版本声明见示例1-1,此处省略。
#include“filename.h”//引用头文件
…
//函数的实现体
voidfunction(…)
{
…
}
示例1-3定义文件的结构
1.4头文件的作用
C语言的初学者虽然会用使用头文件,但常常不明其理,这里对头文件的作用略作解释:
1)通过头文件来调用库功能。
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。
用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。
编译器会从库中提取相应的代码。
2)头文件能加强类型安全检查。
如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
1.5目录结构
如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。
每一个工程都应尽可能将其用到的所有头文件及定义文件放到该工程目录下。
头文件保存于工程目录下的include目录,将定义文件保存于source目录(可以是多级目录)。
第2章程序排版
2.1空行
【规则2-1】在每个类声明之后、每个函数定义结束之后都要加空行。
参见示例2.1(a)。
【规则2-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
参见示例2.1(b)。
示例2-1(a)函数之间的空行示例2-1(b)函数内部的空行
//空行
voidfunction1(…)
{
…
}
//空行
voidfunction2(…)
{
…
}
//空行
voidfunction3(…)
{
…
}
//空行
while(condition)
{
statement1;
//空行
if(condition)
{
statement2;
}
else
{
statement3;
}
//空行
statement4;
}
2.2
代码行
【规则2-3】一行代码只做一件事情,如只定义一个变量,或只写一条语句。
这样的代码容易阅读,并且方便于写注释。
【规则2-4】if、for、while、do等语句各占一行,执行语句不得紧跟其后。
不论执行语句有多少都要加{}。
这样可以防止书写失误。
示例2-2风格良好的代码行
intwidth;//宽度
intheight;//高度
intdepth;//深度
x=a+b;
y=c+d;
z=e+f;
if(width { dosomething(); } for(initialization;condition;update) { dosomething(); } //空行 other(); 【建议2-1】尽可能在定义变量的同时初始化该变量(就近原则)。 如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。 如果引用了未被初始化的变量,可能会导致程序错误。 本建议可以减少隐患。 示例2-3风格良好的变量初始化 intwidth=10;//定义并初绐化width intheight=10;//定义并初绐化height intdepth=10;//定义并初绐化depth 2.3 空格 【规则2-5】程序块要采用缩进风格编写,只使用空格键,且缩进的空格数为4个,不使用TAB键。 【规则2-6】关键字之后要留空格。 像const、virtual、inline、case等关键字之后至少要留一个空格,否则无法辨析关键字。 像if、for、while等关键字之后应留一个空格再跟左括号“(”,以突出关键字。 【规则2-7】函数名之后不要留空格,紧跟左括号“(”,以与关键字区别。 【规则2-8】“(”向后紧跟,“)”、“,”、“;”向前紧跟,紧跟处不留空格。 【规则2-9】“,”之后要留空格,如function(x,y,z)。 如果‘;’不是一行的结束符号,其后要留空格,如for(initialization;condition;update)。 【规则2-10】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。 【规则2-11】一元操作符如“! ”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。 【规则2-12】像“[]”、“.”、“->”这类操作符前后不加空格。 【建议2-2】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d))。 示例2-4代码行内的空格 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<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;//不要写成array[5]=0; a.function();//不要写成a.function(); b->function();//不要写成b->function(); 2.4 对齐 【规则2-13】程序的分界符“{”和“}”应独占一行并且位于同一列,同时与引用它们的语句左对齐。 【规则2-14】{}之内的代码块在“{”右边数格处左对齐。 示例2-5(a)风格良好的对齐示例2-5(b)风格不良的对齐 voidfunction(intx) { …//programcode } voidfunction(intx){ …//programcode } if(condition) { …//programcode } else { …//programcode } if(condition){ …//programcode } else{ …//programcode } for(initialization;condition;update) { …//programcode } for(initialization;condition;update){ …//programcode } while(condition){ { …//programcode } while(condition){ …//programcode } 如果出现嵌套的{},则使用缩进对齐,如: { … { … } … } 2.5 长行拆分 【规则2-14】代码行最大长度宜控制在70至80个字符以内。 代码行不要过长,否则眼睛看不过来,也不便于打印。 【规则2-15】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。 拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例2-6长行的拆分 if((very_longer_variable1>=very_longer_variable12) &&(very_longer_variable3<=very_longer_variable14) &&(very_longer_variable5<=very_longer_variable16)) { do_something(); } intcopy_person_address(PERSON_BASE_INFO_STRUPERSON_A, PERSON_BASE_INFO_STRUPERSON_B); for(very_longer_initialization; very_longer_condition; very_longer_update) { do_something(); } 2.6修饰符的位置 【规则2-16】应当将修饰符*和&紧靠变量名。 char*name; int*x,y;//此处y不会被误解为指针 示例2-7修饰符的位置 第3章注释 C语言的块注释符为“/*…*/”,行注释一般采用“//…”。 注释通常用于: 1)版本、版权声明; 2)函数接口说明; 3)重要的代码行或段落提示。 虽然注释有助于理解代码,但注意不可过多地使用注释。 参见示例3-1。 【规则3-1】程序中的注释不可喧宾夺主,应简洁明了。 【规则3-2】如果代码本来就是清楚的,则不必加注释。 【规则3-3】边写代码边注释,修改代码的同时修改相应的注释,以保证注释与代码的一致性。 不再有用的注释要删除。 【规则3-4】注释应当准确、易懂,防止注释有二义性。 【规则3-5】尽量避免在注释中使用缩写,特别是不常用缩写。 【规则3-6】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。 【规则3-7】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。 【规则3-8】注释与所描述内容进行同样的缩排。 【规则3-9】每个函数定义前都要求有函数功能、输入、输出等参数的说明。 格式见示例3-1。 示例3-1程序的注释 /* *函数介绍: *输入参数: *输出参数: *返回值: */ voidfunction(floatx,floaty,floatz) { … } if(…) { … while(…) { … }//endofwhile … }//endofif 【规则3-10】对于所有的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。 对分支语句(条件分支、循环语句等)必须编写注释。 【规则3-11】全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。 参见示例3-2。 /*TheErrorCodewhenSCCPtranslate*/ /*GlobalTitlefailure,asfollows*///变量作用、含义 /*0-SUCCESS1-GTTableerror*/ /*2-GTerrorOthers-nouse*///变量取值范围 /*onlyfunctionSCCP_translate()inthismodualcanmodifyit,*/ /*andothermodulecanvisititthroughcall*/ /*thefunctionget_trans_error_code()*///使用方法 charg_trans_error_code; 示例3-2全局变量的注释 第4章命名规则 【规则4-1】标识符应当直观且可以拼读,可望文知意,可标识符最好采用英文单词或其组合,便于记忆和阅读。 切忌使用汉语拼音来命名。 【规则4-2】标识符的长度应当符合“min-length&&max-information”原则, 即采用能代表变量或函数信息的最短长度字符即可。 【规则4-3】命名中若使用特殊约定或缩写,则要有注释说明。 应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。 【规则4-4】程序中不要出现仅靠大小写区分的相似的标识符。 【规则4-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。 【规则4-6】变量和函数的名字中,除了专有名词(如硬件设备,寄存器,标准和协议等等)部分以外采用大写,其余均采用小写与下划线混排的格式。 参见示例4-1和示例4-2。 【规则4-7】全局变量以g_开头,后面紧接变量名,这样便于与局部变量区分。 floatold_value; intset_value(...); 示例4-1基本的变量和函数命名规则 intTCP_rev_buff[1024]; intUSART_transmit_data(...); 示例4-2含有专有名词的变量和函数命名规则 【规则4-8】常量、宏定义、自定义结构体的名字均采用大写与下划线混排的格式。 参见示例4-3。 示例4-3常量和结构的命名 #defineRADIUS100; constunsignedcharRADIUS=100; typedefstructPERSON_BASE_INFO_STRU{ unsignedcharname[8]; unsignedcharage; unsignedcharsex; }PERSON_BASE_INFO; 【规则4-9】变量的名字应当使用“名词”或者“形容词+名词”。 参见示例4-4。 示例4-4变量的命名 floatvalue; floatold_value; floatnew_value; 【规则4-10】函数的名字应当使用“动词”、“动词+名词”(动宾词组)。 参见示例4-5。 示例4-5函数的命名 draw_box(); get_value(); 【规则4-11】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 参见示例4-6。 示例4-6互斥意义的变量和函数的命名 intmin_value; intmax_value; intset_value(…); intget_value(…); 【建议4-1】尽量避免名字中出现数字编号,如value1,value2等,除非逻辑上的确需要编号。 【建议4-2】对于变量命名,禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。 第5章常量、变量和结构 5.1常量 常量是一种标识符,它的值在运行期间恒定不变。 C语言用#define来定义常量(称为宏常量)。 如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? (1)程序的可读性(可理解性)变差。 程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。 (2)在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 (3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。 【规则5-1】尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。 【规则5-2】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。 为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。 【规则5-3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验室 内部 语言 编程 规范 V10