1、ISOS编程规范说明书ISOS V5.0编程规范说明书2012年2月目录1 引言 11.1 编写目的 12 概述 12.1 目标 12.2 适用范围 12.3 需求 12.4 局限 13 编程规范总原则 14 标识符 24.1 变量名 24.1.1 不同作用域变量的命名 24.1.2 变量类型的重定义 24.1.3 不同类型变量的命名(匈牙利命名法) 24.1.4 指针变量的命名 34.1.5 函数指针变量的命名 34.1.6 在某一模块中定义的全局变量,变量名的开始需有模块名。 44.2 函数名 44.3 数据结构 45 排版 45.1 用缩进格式书写代码 55.2 长语句 55.3 空行和
2、空格的使用 56 表达式与基本语句 66.1 运算表达式 66.2 if 语句 66.2.1 布尔变量与零值比较 66.2.2 整型变量与零值比较 76.2.3 浮点变量与零值比较 76.2.4 对if 语句的补充说明 76.3 Switch语句 77 常量 87.1 为什么要用常量 87.2 定义常量的方法 87.2.1 #define 宏定义 87.2.2 const 常量 97.2.3 枚举 97.3 函数返回值常量定义 97.4 特性开关宏定义 98 注释 98.1 注释的基本概念 108.2 注释的准确性 108.3 变量、常量的注释 108.4 函数的注释 118.5 修改注释 1
3、28.6 /* */ 、/*以及/* 129 文件布局 129.1 C以及h文件头要求 129.2 C源代码文件布局要求 139.3 H头文件要求 159.4 H头文件布局 159.5 ip_pub.h 169.6 ip_def.h 169.7 ip_ext.h 179.8 ip_fun.h 179.9 各个H头文件关系 171 引言1.1 编写目的作为一个大型的项目,每个工程师的编程习惯都不相同,所以对编程风格、规范进行统一就显得十分必要。2 概述2.1 目标本文档为统一ISOS平台的编程规范而写作。2.2 适用范围本文档虽然为ISOS平台制作,但可以推广到其他项目组。2.3 需求 程序最重
4、要的是正确性,其次是可维护性,最后才是效率; 学习如何写优美的程序与学习如何正确地编写代码同样重要; 让程序尽量简单易懂,即使违背了某些规则也无关紧要; 一个运行正常但没有注释的程序如同一个等待爆炸的定时炸弹,因为早晚会有人修改或升级这个程序; 好风格应该成为一种习惯。如果你在开始写代码时就关心风格问题,如果你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。一旦这种习惯变成自动的东西,你的潜意识就会帮你照料许多细节问题,甚至你在工作压力下写出的代码也会更好。2.4 局限此文档完成时间比较仓促,需要在后续实践中逐步完善。3 编程规范总原则 本规范具有强制性,一旦制定,必须按照规范执行 规范
5、在未经批准修改之前,必须按照现行规范执行4 标识符标识符的命名要清晰、明了,有明确含义。使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。 标识符应当采用英文单词或其组合,切忌使用汉语拼音来命名。4.1 变量名4.1.1 不同作用域变量的命名 局部变量尽量包含较多的信息; 全局变量以首字母以g_开始命名; 定义类型和宏定义常数以大写字母命名; 变量的作用域越大,它的名字所带有的信息就应该越多。 局部变量: ULONG ulStudentAge; 全局变量: ULONG g_ulSudentAge; 宏定义常数: #define STUDENT_NUM 10 类型定义: typedef
6、INT16S int;4.1.2 变量类型的重定义由于变量类型比较多,为了整个项目的统一,对一些常用的变量类型进行重新定义:typedef char CHAR ; /有符号的单字节变量类型typedef unsigned char UCHAR; /无符号的单字节变量类型typedef short int SHORT; /有符号的双字节变量类型typedef unsigned short int USHORT; /无符号的双字节变量类型typedef long LONG; /有符号的四字节变量类型typedef unsigned long ULONG ; /无符号的四字节变量类型typedef
7、long long LLONG ; /有符号的八字节变量类型typedef unsigned long long ULLONG; /无符号的八字节变量类型typedef float FLOAT ; /单精度浮点变量类型typedef double DOUBLE ; /双精度浮点变量类型typedef void VOID; typedef int BOOL; / BOOL变量typedef struct volatile int counter; ATOMIC_S; /需要原子操作的变量类型4.1.3 不同类型变量的命名(匈牙利命名法)匈牙利命名法是一种命名约定。匈牙利命名法把变量的类型 (或者
8、它的预期使用)等信息编码在变量名中。一些常用的匈牙利命名法前缀数据类型 前缀 例子 CHAR c cInChar UCHAR uc ucOutChar SHORT s sReturnValue USHORT us usControlWord LONG l lNumRecs ULONG ul ulLength LLONG ll llNumRecs ULLONG ull ullLengthFLOAT f fStatic DOUBLE d dLengthBOOL bl blFlagTXT_BOX_S st stBox/结构enum TXT_BOX_M em emBox/枚举union PROT_U
9、un unProto/联合ATOMIC_S at atDataRef/原子4.1.4 指针变量的命名 对于指针的定义,名称大小写根据指针为全局/局部变量来定,但指针名必须以小写的“p”开头。 如: ULONG *g_pulDay; /全局指针 ULONG *pulKeyday; /局部指针 ULONG *ppulKeyDay; /指针的指针4.1.5 函数指针变量的命名 对于函数指针变量必须以pfunc开头。如: main() ULONG SSP_Max(LONG, LONG); ULONG (*pfuncMax)(); /指向函数的指针申明 LONG a,b,c; pfuncMax = SS
10、P_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 中的变量: USHORT g_usKeyNum; ULONG g_ulKeyNumBuff10;4.2 函数名 函数名的命名应象全局变量一样采用首字母大写方式 函数名的开始应以“ 模块名_ ”的格式注明函数所属模块例如: KEY.C模块的函数 VOID KEY_
11、Init(VOID); VOID KEY_StartScan(VOID); VOID KEY_StopScan(VOID);4.3 数据结构 数据结构名称必须以st开头 数据结构必须重新定义为一个以_S结尾,紧接着大写字母表示的名称例如: typedef struct stTxtBox ULLONG *pullTxt; /文字 ULLONG ullTxtFont; /字体 ULLONG ullSta; /文本框状态模式 ULLONG ulWorkMod; /工作模式TXT_BOX_S;5 排版名字的合理选择可以帮助理解程序。同样,也应该以尽可能一目了然的形式书写语句。这就像保持书桌整洁可以使你
12、容易找到东西一样。5.1 用缩进格式书写代码 函数或过程的开始、结构定义及循环、判断等语句中的代码都要采用缩进; 缩进的空格数为4个; 使用空格键,不使用TAB键; 程序块的分界符(和)应各独占一行。例: for(i = 0; i 0) total_score += fScorei; 5.2 长语句 较长的语句(多于80字符)要分成多行书写; 长表达式要在低优先级操作符处划分新行,操作符放在新行之首; 划分出的新行要进行适当的缩进,使排版整齐,语句可读; 不允许把多个短语句写在一行中,即一行只写一条语句。 例:修改前: MeasData.TransTdir=TransTdir*SetData.
13、Filter+TransTdir*(1-SetData.Filter); 修改后:MeasData.TransTdir = TransTdir * SetData.Filter + TransTdir * (1 - SetData.Filter); 5.3 空行和空格的使用 相对独立的程序块之间、变量定义之后语句开始以前必须加空行 ; 逗号、分号只在后面加空格 ; 比较操作符、赋值操作符、算术操作符、逻辑操作符、位域操作符等双目操作符的前后加空格; “!”、“”、“+”、“-”、“&”等单目操作符前后不加空格; -、.前后不加空格。 例: VOID Func1(LONG lx, LONG ly
14、, LONG lz); / 良好的风格VOID Func1 (LONG lx,LONG ly,LONG lz); / 不良的风格 x = a b ? a : b; / 良好的风格 x=a= b & c d & c + f = g + h; /复合表达式过于复杂 不要有多用途的复合表达式;例如:d = (a = b + c) + r ; /应拆分为两个语句:a = b + c;d = a + r; 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。例如: if(a | b & a & c) /不良的风格if(a | b) & (a & c) /良好的风格注意: 只需记住加减运算的优先级低于乘除运算,其它地方
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1