ISOS编程规范说明书.docx
《ISOS编程规范说明书.docx》由会员分享,可在线阅读,更多相关《ISOS编程规范说明书.docx(21页珍藏版)》请在冰豆网上搜索。
![ISOS编程规范说明书.docx](https://file1.bdocx.com/fileroot1/2022-11/16/41b65fbd-9c0a-46b3-95af-fa7dd0616a95/41b65fbd-9c0a-46b3-95af-fa7dd0616a951.gif)
ISOS编程规范说明书
ISOSV5.0
编程规范说明书
2012年2月
目录
1引言1
1.1编写目的1
2概述1
2.1目标1
2.2适用范围1
2.3需求1
2.4局限1
3编程规范总原则1
4标识符2
4.1变量名2
4.1.1不同作用域变量的命名2
4.1.2变量类型的重定义2
4.1.3不同类型变量的命名(匈牙利命名法)2
4.1.4指针变量的命名3
4.1.5函数指针变量的命名3
4.1.6在某一模块中定义的全局变量,变量名的开始需有模块名。
4
4.2函数名4
4.3数据结构4
5排版4
5.1用缩进格式书写代码5
5.2长语句5
5.3空行和空格的使用5
6表达式与基本语句6
6.1运算表达式6
6.2if语句6
6.2.1布尔变量与零值比较6
6.2.2整型变量与零值比较7
6.2.3浮点变量与零值比较7
6.2.4对if语句的补充说明7
6.3Switch语句7
7常量8
7.1为什么要用常量8
7.2定义常量的方法8
7.2.1#define宏定义8
7.2.2const常量9
7.2.3枚举9
7.3函数返回值常量定义9
7.4特性开关宏定义9
8注释9
8.1注释的基本概念10
8.2注释的准确性10
8.3变量、常量的注释10
8.4函数的注释11
8.5修改注释12
8.6/**/、/**以及/**<12
9文件布局12
9.1C以及h文件头要求12
9.2C源代码文件布局要求13
9.3H头文件要求15
9.4H头文件布局15
9.5ip_pub.h16
9.6ip_def.h16
9.7ip_ext.h17
9.8ip_fun.h17
9.9各个H头文件关系17
1引言
1.1编写目的
作为一个大型的项目,每个工程师的编程习惯都不相同,所以对编程风格、规范进行统一就显得十分必要。
2概述
2.1目标
本文档为统一ISOS平台的编程规范而写作。
2.2适用范围
本文档虽然为ISOS平台制作,但可以推广到其他项目组。
2.3需求
Ø程序最重要的是正确性,其次是可维护性,最后才是效率;
Ø学习如何写优美的程序与学习如何正确地编写代码同样重要;
Ø让程序尽量简单易懂,即使违背了某些规则也无关紧要;
Ø一个运行正常但没有注释的程序如同一个等待爆炸的定时炸弹,因为早晚会有人修改或升级这个程序;
Ø好风格应该成为一种习惯。
如果你在开始写代码时就关心风格问题,如果你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。
一旦这种习惯变成自动的东西,你的潜意识就会帮你照料许多细节问题,甚至你在工作压力下写出的代码也会更好。
2.4局限
此文档完成时间比较仓促,需要在后续实践中逐步完善。
3编程规范总原则
Ø本规范具有强制性,一旦制定,必须按照规范执行
Ø规范在未经批准修改之前,必须按照现行规范执行
4标识符
标识符的命名要清晰、明了,有明确含义。
使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
标识符应当采用英文单词或其组合,切忌使用汉语拼音来命名。
4.1变量名
4.1.1不同作用域变量的命名
Ø局部变量尽量包含较多的信息;
Ø全局变量以首字母以g_开始命名;
Ø定义类型和宏定义常数以大写字母命名;
Ø变量的作用域越大,它的名字所带有的信息就应该越多。
局部变量:
ULONGulStudentAge;
全局变量:
ULONGg_ulSudentAge;
宏定义常数:
#defineSTUDENT_NUM10
类型定义:
typedefINT16Sint;
4.1.2变量类型的重定义
由于变量类型比较多,为了整个项目的统一,对一些常用的变量类型进行重新定义:
typedefcharCHAR;//有符号的单字节变量类型
typedefunsignedcharUCHAR;//无符号的单字节变量类型
typedefshortintSHORT;//有符号的双字节变量类型
typedefunsignedshortintUSHORT;//无符号的双字节变量类型
typedeflongLONG;//有符号的四字节变量类型
typedefunsignedlongULONG;//无符号的四字节变量类型
typedeflonglongLLONG;//有符号的八字节变量类型
typedefunsignedlonglongULLONG;//无符号的八字节变量类型
typedeffloatFLOAT;//单精度浮点变量类型
typedefdoubleDOUBLE;/双精度浮点变量类型
typedefvoidVOID;
typedefintBOOL;//BOOL变量
typedefstruct{volatileintcounter;}ATOMIC_S;//需要原子操作的变量类型
4.1.3不同类型变量的命名(匈牙利命名法)
匈牙利命名法是一种命名约定。
匈牙利命名法把变量的类型 (或者它的预期使用) 等信息编码在变量名中。
一些常用的匈牙利命名法前缀
数据类型前缀例子
CHARccInChar
UCHARucucOutChar
SHORTssReturnValue
USHORTususControlWord
LONGllNumRecs
ULONGululLength
LLONGllllNumRecs
ULLONGullullLength
FLOATffStatic
DOUBLEddLength
BOOLblblFlag
TXT_BOX_SststBox//结构
enumTXT_BOX_MememBox//枚举
unionPROT_UununProto//联合
ATOMIC_SatatDataRef//原子
4.1.4指针变量的命名
对于指针的定义,名称大小写根据指针为全局/局部变量来定,但指针名必须以小写的“p”开头。
如:
ULONG*g_pulDay;//全局指针
ULONG*pulKeyday;//局部指针
ULONG**ppulKeyDay;//指针的指针
4.1.5函数指针变量的命名
对于函数指针变量必须以pfunc开头。
如:
main()
{
ULONGSSP_Max(LONG,LONG);
ULONG(*pfuncMax)();//指向函数的指针申明
LONGa,b,c;
pfuncMax=SSP_Max;//给指向函数的指针赋值
SSP_Scanf(“%d,%d”,&a,&b);
c=(*pfuncMax)(a,b);//调用指向的函数
SSP_Printf(“a=%d,b=%d,max=%d”,a,b,c);
}
4.1.6在某一模块中定义的全局变量,变量名的开始需有模块名。
如:
模块KEY.C中的变量:
USHORTg_usKeyNum;
ULONGg_ulKeyNumBuff[10];
4.2函数名
Ø函数名的命名应象全局变量一样采用首字母大写方式
Ø函数名的开始应以“模块名_”的格式注明函数所属模块
例如:
KEY.C模块的函数
VOIDKEY_Init(VOID);
VOIDKEY_StartScan(VOID);
VOIDKEY_StopScan(VOID);
4.3数据结构
Ø数据结构名称必须以st开头
Ø数据结构必须重新定义为一个以_S结尾,紧接着大写字母表示的名称
例如:
typedefstructstTxtBox
{
ULLONG*pullTxt;//文字
ULLONGullTxtFont;//字体
ULLONGullSta;//文本框状态模式
ULLONGulWorkMod;//工作模式
}TXT_BOX_S;
5排版
名字的合理选择可以帮助理解程序。
同样,也应该以尽可能一目了然的形式书写语句。
这就像保持书桌整洁可以使你容易找到东西一样。
5.1用缩进格式书写代码
Ø函数或过程的开始、结构定义及循环、判断等语句中的代码都要采用缩进;
Ø缩进的空格数为4个;
Ø使用空格键,不使用TAB键;
Ø程序块的分界符(‘{’和‘}’)应各独占一行。
例:
for(i=0;i{
if(fScore[i]>0)
{
total_score+=fScore[i];
}
}
5.2长语句
Ø较长的语句(多于80字符)要分成多行书写;
Ø长表达式要在低优先级操作符处划分新行,操作符放在新行之首;
Ø划分出的新行要进行适当的缩进,使排版整齐,语句可读;
Ø不允许把多个短语句写在一行中,即一行只写一条语句。
例:
修改前:
MeasData.TransT[dir]=TransT[dir]*SetData.Filter+TransT[dir]*(1-SetData.Filter);
修改后:
MeasData.TransT[dir]=TransT[dir]*SetData.Filter
+TransT[dir]*(1-SetData.Filter);
5.3空行和空格的使用
Ø相对独立的程序块之间、变量定义之后语句开始以前必须加空行;
Ø逗号、分号只在后面加空格;
Ø比较操作符、赋值操作符、算术操作符、逻辑操作符、位域操作符等双目操作符的前后加空格;
Ø“!
”、“~”、“++”、“--”、“&”等单目操作符前后不加空格;
Ø"->"、"."前后不加空格。
例:
VOIDFunc1(LONGlx,LONGly,LONGlz);//良好的风格
VOIDFunc1(LONGlx,LONGly,LONGlz);//不良的风格
x=a
a:
b;//良好的风格
x=a
a:
b;//不好的风格
int*x=&y;//良好的风格
int*x=&y;//不良的风格
6表达式与基本语句
6.1运算表达式
Ø不要编写太复杂的复合表达式;
例如:
i=a>=b&&cØ不要有多用途的复合表达式;
例如:
d=(a=b+c)+r;//应拆分为两个语句:
a=b+c;
d=a+r;
Ø如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
例如:
if(a|b&&a&c)//不良的风格
if((a|b)&&(a&c))//良好的风格
注意:
只需记住加减运算的优先级低于乘除运算,其它地方