软件设计规范_第1页
软件设计规范_第2页
软件设计规范_第3页
软件设计规范_第4页
软件设计规范_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件设计规范制订:审核:同意:文献编号生效日期版本号分发部门修订履历序号版本修订内容修订人修订日期会签与文献发放:会签部门会签人会签日期签收部门签收人签收日期深圳市德卡科技有限公司文献编号文献版本A1生效日期软件设计规范发行类别■新增□修订发行部门研发中心目录HYPERLINK第一章、项目模块划分 15HYPERLINK一、模块划分 15HYPERLINK二、模块命名 15HYPERLINK第二章、文献格式 15HYPERLINK一、c文献格式阐明: 16HYPERLINK1、文献创立及修改阐明区 16HYPERLINK2、头文献引用区 16HYPERLINK3、全局变量定义区 16HYPERLINK4、驱动函数区 16HYPERLINK5、应用函数区 17HYPERLINK6、文献结束阐明 17HYPERLINK二、h文献格式阐明 17HYPERLINK1、文献创立及修改阐明区 17HYPERLINK2、防重调用定义 18HYPERLINK3、头文献引用 18HYPERLINK4、控制接口定义区 18HYPERLINK5、常量定义区 19HYPERLINK6、宏调用定义区 19HYPERLINK7、类型定义区 19HYPERLINK8、外部引用变量区 19HYPERLINK9、外部引用函数区 20HYPERLINK10、操作流程阐明区 20HYPERLINK11、文献结束阐明 20HYPERLINK第三章、命名规则 21HYPERLINK一、函数命名规则 21HYPERLINK二、变量命名规则 21HYPERLINK三、宏命名规则 22HYPERLINK四、文献命名规则 22HYPERLINK五、新定义变量类型命名规则 22HYPERLINK六、命名注意事项: 22HYPERLINK1、标记符命名基本原则 23HYPERLINK2、命名中若使用特殊商定或缩写,则要有注释阐明 23HYPERLINK3、局部循环变量也必须按照变量命名规则来定义 23HYPERLINK4、不要用数字或较奇怪的字符来定义标记符 23HYPERLINK5、用对的的反义词组命名含有互斥意义的变量或相反动作的函数等 23HYPERLINK6、避免使用下列划线开始和结尾的定义 23HYPERLINK7、程序中不要出现仅靠大小写辨别的相似的标记符 23HYPERLINK8、标记符缩写 24HYPERLINK9、函数名应精确描述函数的功效 24HYPERLINK10、避免使用无意义或含义不清的动词为函数命名 24HYPERLINK第四章、代码书写规范 24HYPERLINK一、基本原则 24HYPERLINK二、排版 24HYPERLINK1、缩进风格 24HYPERLINK2、不要使用【TAB】键 24HYPERLINK3、空行 24HYPERLINK4、语句长度要不大于80个字符 25HYPERLINK5、长语句换行 25HYPERLINK6、长体现式换行 26HYPERLINK7、若函数的参数较长,则要进行合适的划分 26HYPERLINK8、一行只写一条语句 26HYPERLINK9、括号{} 27HYPERLINK10、语句缩进规定 27HYPERLINK11、分界符 28HYPERLINK12、空格 29HYPERLINK三、注释 30HYPERLINK1、注释量 30HYPERLINK2、函数头部注释 30HYPERLINK3、代码与注释同时修改 31HYPERLINK4、注释的内容要清晰、明了,含义精确,避免注释二义性 31HYPERLINK5、避免在注释中使用缩写,特别是非惯用缩写 31HYPERLINK6、注释书写位置 31HYPERLINK7、变量、常量命名不能充足自注释的,必须加以注释 32HYPERLINK8、数据构造命名不能充足自注释的,必须加以注释 32HYPERLINK9、全局变量注释 32HYPERLINK10、注释要与说描述的内容进行同样的缩排 32HYPERLINK11、将注释与其上面的代码用空行隔开 33HYPERLINK12、持续case语句解决时,必须编写注释 34HYPERLINK13、代码或体现式的中间严禁插入注释 36HYPERLINK14、通过对的命名使代码成为自注释的 36HYPERLINK15、在代码的功效、意图层次上进行注释,提供有用、额外的信息 36HYPERLINK16、在程序块的结束行右方加注释标记,以表明某程序块的结束 36HYPERLINK17、注释格式 37HYPERLINK18、采用中文注释 37HYPERLINK19、使用#if0和#endif注释代码块 37HYPERLINK20、注释不能嵌套 37HYPERLINK四、代码可读性 37HYPERLINK1、使用小括号明确体现式的操作次序 37HYPERLINK2、用故意义的枚举和宏替代数字 38HYPERLINK3、源程序中关系较为紧密的代码应尽量相邻 39HYPERLINK4、用多行简朴语句替代复杂语句 39HYPERLINK五、变量,构造 40HYPERLINK1、公共变量 40HYPERLINK1.1、去掉没必要的公共变量 40HYPERLINK1.2、认真定义并明确公共变量的含义、作用、取值范畴及公共变量间的关系 40HYPERLINK1.3、明确公共变量与操作此公共变量的函数或过程的关系 40HYPERLINK1.4、要谨慎向公共变量传递数据 40HYPERLINK1.5、避免局部变量与公共变量同名。 40HYPERLINK1.6、公共变量仅由模块或函数创立和修改,其它模块和函数只能访问 40HYPERLINK2、局部变量 41HYPERLINK2.1、严禁使用未经初始化的变量作为右值 41HYPERLINK2.2、不使用与硬件或软件环境关系亲密的变量 41HYPERLINK2.3、变量声明时,同一类型,不同意义的多个变量,要分行,便于辨别 41HYPERLINK2.4、对只设立一次的变量,宜使用“const”限定词进行声明 41HYPERLINK2.5、避免在函数中使用static局部变量 41HYPERLINK3、数组 41HYPERLINK3.1、数组大小及初始值要明拟定义 41HYPERLINK3.2、数组、构造和联合的初始化列表应显式描述 41HYPERLINK4、构造、联合 42HYPERLINK4.1、构造的功效要单一,是针对一种事务的抽象 42HYPERLINK4.2、不要设计面面俱到、非常灵活的数据构造 43HYPERLINK4.3、不同构造间的关系不要过于复杂 43HYPERLINK4.4、构造中元素的个数应适中 44HYPERLINK4.5、构造体中元素的布局 44HYPERLINK4.6、构造体设计要考虑兼容性 45HYPERLINK4.7、跨平台数据构造,要考虑字节次序及对齐问题 45HYPERLINK4.8、struct或union类型中最少应有一种组员 46HYPERLINK4.9、struct或union类型的组员类型 46HYPERLINK5、枚举 47HYPERLINK5.1、枚举元素的初始化应完整 47HYPERLINK6、自定义数据类型 47HYPERLINK6.1、合理地设计数据并使用自定义数据类型 47HYPERLINK6.2、自定义数据类型命名要恰当 47HYPERLINK7、类型转换 47HYPERLINK7.1、谨慎使用数据类型的强制转换 47HYPERLINK7.2、理解编译系统默认的数据类型转换 47HYPERLINK7.3、应严禁signed类型与unsigned类型之间的隐式转化 48HYPERLINK7.4、应严禁int类型与float类型的隐式转化 48HYPERLINK8、指针 48HYPERLINK8.1、不应对指针变量使用强制类型转换赋值 48HYPERLINK8.2、不应把自动类型的局部变量的地址赋值给外部指针 48HYPERLINK8.3、指针的指针不应超出两级 48HYPERLINK8.4、指向不同数据类型的指针之间不应互相转换 48HYPERLINK8.5、指针转换过程中不应丢失指针的const、volatile属性 48HYPERLINK8.6、只有指向数组的指针才允许进行算术运算 48HYPERLINK8.7、只有指向同一数组的两个指针才允许相减 49HYPERLINK8.8、只有指向同一数组的两个指针才允许用>、>=、<和<=等关系运算符进行比较 49HYPERLINK8.9、指针的索引值不应为负 50HYPERLINK8.10、不应对指针值可能为NULL的指针进行算术运算 50HYPERLINK8.11、调用返回类型为指针的函数后,应进行与否为空的判断 50HYPERLINK8.12、局部变量的地址不应在本对象消亡后传给另外一种对象 50HYPERLINK8.13、一种未知大小的对象的指针不应成为加法或者减法操作的左操作数 51HYPERLINK六、函数 51HYPERLINK1、函数编写原则 51HYPERLINK1.1、明确函数功效,精确(而不是近似)地实现函数设计 51HYPERLINK1.2、函数的规模尽量限制在200行以内 51HYPERLINK1.3、一种函数仅完毕一件功效 51HYPERLINK1.4、为简朴功效编写函数 51HYPERLINK1.5、不要设计多用途面面俱到的函数 52HYPERLINK1.6、函数功效含有可预测性 52HYPERLINK1.7、函数功效含有独立性 52HYPERLINK1.8、避免函数出现随机内聚 53HYPERLINK1.9、功效不明确的较小函数,能够不必存在 54HYPERLINK1.10、设计高扇入、合理扇出(不大于7)的函数 54HYPERLINK1.11、减少函数本身或函数间的递归调用 54HYPERLINK1.12、减少函数间的耦合度 54HYPERLINK2、函数参数 55HYPERLINK2.1、明确接口函数参数的正当性检查者 55HYPERLINK2.2、避免将函数的参数作为工作变量 55HYPERLINK2.3、避免设计多参数函数,不使用的参数从接口中去掉 56HYPERLINK2.4、非调度函数应减少或避免控制参数,尽量只使用数据参数 56HYPERLINK2.5、检查函数全部参数输入的有效性 57HYPERLINK2.6、检查函数全部非参数输入的有效性,如数据文献、公共变量等 57HYPERLINK2.7、调用函数时参数类型要一致 57HYPERLINK2.8、避免使用BOOL参数 57HYPERLINK2.9、在函数参数中不应使用static存储类标记符 57HYPERLINK2.10、函数参数数量 57HYPERLINK2.11、宜避免函数参数在调用中未被使用 57HYPERLINK3、函数返回 58HYPERLINK3.1、对所调用函数的错误返回码要认真、全方面地解决 58HYPERLINK3.2、函数的返回值要清晰、明了,让使用者不容易无视错误状况 58HYPERLINK3.3、函数返回值要与赋值变量类型一致 58HYPERLINK3.4、对于提供了返回值的函数,在引用时最佳使用其返回值 58HYPERLINK3.5、函数只有一种出口 58HYPERLINK4、可重入函数 58HYPERLINK4.1、可重入函数使用局部变量 58HYPERLINK4.2、可重入函数使用全局变量 58HYPERLINK5、函数模块划分 59HYPERLINK5.1、认真分析模块的功效,进行函数的划分和组织 59HYPERLINK5.2、如果多段代码重复做同一件事情,那么在函数的划分上可能存在问题 59HYPERLINK5.3、函数内部的代码构造次序 59HYPERLINK6、循环语句 60HYPERLINK6.1、循环控制变量的类型应为整型 60HYPERLINK6.2、循环控制变量应为局部变量 61HYPERLINK6.3、for循环控制语句中的3个体现式只应和循环控制有关 61HYPERLINK6.4、for循环不适宜只执行一次 61HYPERLINK7、判断语句 61HYPERLINK7.1、不要容易用条件分支去替代逻辑体现式 61HYPERLINK7.2、switch语句中不应只包含default语句 61HYPERLINK7.3、全部非空的switchcase子句都应以break语句结束 61HYPERLINK7.4、switch控制体现式不应是一种常量或逻辑体现式 61HYPERLINK7.5、每一种switch语句都应最少有一种case子句 61HYPERLINK7.6、case体现式的类型应与switch控制体现式的类型一致 61HYPERLINK7.7、case体现式的大小不应超出switch控制体现式的大小 61HYPERLINK8、赋值语句 62HYPERLINK8.1、尽量不使用条件赋值语句 62HYPERLINK9、其它注意事项 62HYPERLINK9.1、避免函数中不必要语句,避免程序中的垃圾代码 62HYPERLINK9.2、在多任务操作系统的环境下编程,更要注意函数可重入性的构造 62HYPERLINK9.3、将惯用较长变量用宏替代 62HYPERLINK七、预解决 62HYPERLINK1、宏 62HYPERLINK1.1、用宏定义体现式时,要使用完备的括号 62HYPERLINK1.2、将宏所定义的多条体现式放在大括号中 63HYPERLINK1.3、使用宏时,不允许参数发生变化 63HYPERLINK1.4、函数类宏调用时参数要完整 64HYPERLINK2、条件编译 64HYPERLINK2.1、预解决语句“#if”和“#endif”不应分散在不同的文献之中 64HYPERLINK2.2、被包含文献中的“#else”、“#elseif”、“#endif”不应与父文献中的“#if”匹配 64HYPERLINK2.3、“#if”体现式中使用的宏应当已经被定义,并且“#if”体现式只能包含整型常量 64HYPERLINK2.4、宏如果需要被重定义,应当先用“#undef”解除前面的定义 64HYPERLINK八、中断 64HYPERLINK1、中断服务程序不应有返回值 64HYPERLINK2、中断服务程序中不应使用printf()函数 64HYPERLINK3、对于中断中使用到的非局部变量,在中断解决函数中应对其进行入栈保护 64HYPERLINK4、调用中断解决程序中的变量要进行开关中断解决 64HYPERLINK5、对于开关中断,要注意成对匹配 64HYPERLINK6、中断服务程序代码要简朴化 65HYPERLINK九、程序可测性 65HYPERLINK1、原则 65HYPERLINK1.1、统一的调测开关及打印函数 65HYPERLINK1.2、统一的打印信息串格式 65HYPERLINK1.3、正式软件产品中应把断言及其它调测代码去掉(即把有关的调测开关关掉) 65HYPERLINK1.4、用调测开关切换软件的DEBUG版和正式版 65HYPERLINK1.5、软件DEBUG版和发行版在实现功效上含有一致性 65HYPERLINK1.6、构造测试环境和测试用例 65HYPERLINK1.7、预先设计程序调测的办法和手段及多个调测开关 65HYPERLINK1.8、调测开关应分为不同级别和类型 66HYPERLINK2、断言 66HYPERLINK2.1、使用断言来发现软件问题,提高代码可测性 66HYPERLINK2.2、用断言来检查程序正常运行时不应发生但在调测时有可能发生的非法状况 67HYPERLINK2.3、不能用断言来检查最后产品必定会出现且必须解决的错误状况 67HYPERLINK2.4、对较复杂的断言加上明确的注释 67HYPERLINK2.5、用断言确认函数的参数 67HYPERLINK2.6、用断言确保没有定义的特性或功效不被使用 67HYPERLINK2.7、用断言对程序开发环境(OS/Compiler/Hardware)的假设进行检查 68HYPERLINK2.8、编写防错程序,然后在解决错误之后可用断言宣布发生错误 68HYPERLINK十、程序效率 69HYPERLINK1、原则 69HYPERLINK1.1、编程时要经常注意代码的效率 69HYPERLINK1.2、提高代码效率的前提 69HYPERLINK1.3、局部效率应为全局效率服务 69HYPERLINK1.4、合理划分模块函数 69HYPERLINK1.5、不应花过多的时间拼命地提高调用不很频繁的函数代码效率 70HYPERLINK1.6、不要一味追求紧凑的代码 70HYPERLINK1.7、不应存在执行不到的代码 70HYPERLINK1.8、去掉没必要的全局变量 70HYPERLINK2、办法 70HYPERLINK2.1、解决软件空间效率1 70HYPERLINK2.2、解决软件空间效率2 71HYPERLINK2.3、循环体内工作量最小化 71HYPERLINK2.4、认真分析有关算法,并进行优化 72HYPERLINK2.5、认真考察、分析系统及模块解决输入(如事务、消息等)的方式,并加以改善 72HYPERLINK2.6、直接用汇编编写调用频繁或性能规定极高的函数 72HYPERLINK2.7、在多重循环中,应将最忙的循环放在最内层 72HYPERLINK2.8、尽量减少循环嵌套层次 73HYPERLINK2.9、尽量不在循环体内放置判断语句 73HYPERLINK2.10、尽量用乘法或其它办法替代除法,特别是浮点运算中的除法 74HYPERLINK2.11、应注意switch-case语句的使用 74HYPERLINK十一、程序质量 74HYPERLINK1、原则 74HYPERLINK1.1、代码质量确保优先原则 74HYPERLINK1.2、合理划分子模块,提高可移植性和可重用性 75HYPERLINK1.3、提供良好的接口界面 75HYPERLINK1.4、系统含有一定容错能力 75HYPERLINK2、办法 75HYPERLINK2.1、认真解决程序所能碰到的多个出错状况 75HYPERLINK2.2、系统运行之初,要初始化有关变量及运行环境,避免未经初始化的变量被引用 75HYPERLINK2.3、系统运行之初,要对加载到系统中的数据进行一致性检查 75HYPERLINK2.4、严禁随意更改其它模块或系统的有关设立和配备 75HYPERLINK2.5、不能随意变化与其它模块的接口 75HYPERLINK2.6、避免内存操作越界 75HYPERLINK2.7、编程时,要避免差1错误 76HYPERLINK2.8、要时刻注意易混淆的操作符 76HYPERLINK2.9、条件判断语句必须解决全部状况 76HYPERLINK2.10、不要用goto语句 77HYPERLINK2.11、尽量都采用原则语句和原则库函数 77HYPERLINK2.12、避免使用嵌入式汇编 77HYPERLINK2.13、精心构造算法,并对其性能、效率进行测试 77HYPERLINK2.14、对较核心的算法最佳使用其它算法来确认 77HYPERLINK2.15、时刻注意体现式与否会上溢、下溢 77HYPERLINK2.16、使用变量时要注意其边界值的状况 77HYPERLINK2.17、注意程序代码与否超出系统有关限制 78HYPERLINK2.18、循环、分支层次不要超出五层 78HYPERLINK2.19、不要比较浮点数的相等 78HYPERLINK2.20、关注共用体的存储、对齐模式 78HYPERLINK2.21、头文献中不应有对象或函数的定义 78HYPERLINK2.22、不应单独使用小写字母“l”或大写字母“O”作为变量名 78HYPERLINK2.23、函数声明时参数不应只有类型名没有标记符 78HYPERLINK2.24、不应对有符号数进行位运算 78HYPERLINK2.25、无格式的字符型不应与负数常量和零比较 78HYPERLINK2.26、无符号值不应与负数常量比较 79HYPERLINK2.27、对变量进行移位操作应确保不会产生溢出和数据截短 79HYPERLINK2.28、不应在布尔体现式中使用赋值操作符 79HYPERLINK2.29、不应对布尔体现式进行算术或者位运算 79HYPERLINK2.30、体现式的值在任何求值次序下应保持一致 79HYPERLINK2.31、应避免去数可能为0的状况出现 79HYPERLINK2.32、赋值运算符的左操作数不应进行转换操作,并且应当是一种可更改的对象 79HYPERLINK2.33、sizeof操作符不应用在有单边作用的体现式上 79HYPERLINK2.34、留心具体语言及编译器解决不同数据类型的原则及有关细节 80HYPERLINK十二、代码代码编辑、编译、审查 80HYPERLINK1、打开编译器的全部告警开关对程序进行编译 80HYPERLINK2、在产品软件(项目组)中,要统一编译开关选项 80HYPERLINK3、通过代码走读及审查方式对代码进行检查 80HYPERLINK4、测试部测试产品之前,应对代码进行抽查及评审 80HYPERLINK5、养成随时保存编写代码的习惯 80HYPERLINK6、同产品软件(项目组)内,最佳使用相似的编辑器,并使用相似的设立选项 80HYPERLINK7、要小心地使用编辑器提供的块拷贝功效编程 80HYPERLINK8、合理地设计软件系统目录,方便开发人员使用 80HYPERLINK附录A惯用数据类型及简写 81HYPERLINK附录B惯用单词及缩写 82HYPERLINK附录C常见反义词组 84HYPERLINK附录D常见命名规则 86HYPERLINK一、匈牙利命名法 86HYPERLINK二、骆驼(Camel)命名法 86HYPERLINK三、帕斯卡(Pascal)命名法 86四、下划线命名法 86第一章、项目模块划分一、模块划分将整个项目按照功效进行模块划分,各个模块互相独立,每个模块由一系列c文献和h文献构成。简朴功效的模块采用一种c文献和h文献接口,复杂功效的模块可能需要多个c文献和h文献。二、模块命名按照模块所实现功效的英文名称或者简写命名,全部采用小写字母,多于1个单词的中间加下划线。例如:模块命名阐明液晶lcd.clcd.h液晶初始化,字符、中文和图片显示lcd_fonts.clcd_fonts.h液晶自定义字库按键key.ckey.h按键初始化,键值列表,取按键值批示灯led.cled.h批示灯初始化,闪烁控制数码管ledseg.cledseg.h数码管初始化,数字显示,特殊字符显示蜂鸣器beep.cbeep.h蜂鸣器初始化,鸣叫控制第二章、文献格式一、c文献格式阐明:1、文献创立及修改阐明区重要包含:公司信息:公司名称、公司网站。创立信息:创立者名称,创立日期,最初版本号,文档内容描述。修改信息:修改者名称,修改日期,修改后版本号,修改内容描述。可参考模块《template.c》阐明:与硬件有关的文献能够在此增加阐明,如芯片型号等。2、头文献引用区重要包含:系统头文献引用:文献名包含在尖括号中。自定义头文献引用:文献名包含着双引号中。可参考模块《template.c》3、全局变量定义区重要包含:全局变量定义区阐明注释行:全局变量定义:要赋初值。全局变量注释:可参考模块《template.c》。4、驱动函数区重要包含:驱动函数区阐明注释行:函数阐明:包含函数阐明,参数阐明,返回值阐明。函数体:可参考模块《template.c》5、应用函数区重要包含:应用函数区阐明注释行:函数阐明:包含函数功效阐明,参数阐明,返回值阐明。函数体:可参考模块《template.c》6、文献结束阐明重要包含:文献结束阐明:EndOfFile可参考模块《template.c》二、h文献格式阐明1、文献创立及修改阐明区重要包含:公司信息:公司名称、公司网站。创立信息:创立者名称,创立日期,最初版本号,文档内容描述。修改信息:修改者名称,修改日期,修改后版本号,修改内容描述。可参考模块《template.h》2、防重调用定义命名规则:下划线+文献名大写+下划线+文献类型H+下划线可参考模块《template.h》3、头文献引用重要包含:系统头文献引用:文献名包含在尖括号中。自定义头文献引用:文献名包含着双引号中。可参考模块《template.h》4、控制接口定义区重要包含:控制口线定义区阐明注释行:接口定义:全部采用大写字母,单词间下列划线分割注释阐明:可参考模块《template.h》5、常量定义区重要包含:常量定义区阐明注释行:常量定义:全部采用大写字母,单词间下列划线分割注释阐明:可参考模块《template.h》6、宏调用定义区重要包含:宏调用定义区阐明注释行:宏调用解决:注释阐明:可参考模块《template.h》7、类型定义区重要包含:类型定义区阐明注释行:类型定义:注释阐明:构造体组员要单独阐明。可参考模块《template.h》8、外部引用变量区重要包含:外部应用变量区阐明注释行:引用变量声明:以extern核心字开始注释阐明:可参考模块《template.h》9、外部引用函数区重要包含:外部应用函数区阐明注释行:函数注释阐明:包含函数功效阐明,参数阐明,返回值阐明引用函数声明:以extern核心字开始可参考模块《template.h》10、操作流程阐明区重要包含:操作流程阐明区阐明注释行:模块执行流程阐明:阐明要具体,执行环节要明确。可参考模块《template.h》11、文献结束阐明重要包含:文献结束阐明:EndOfFile可参考模块《template.h》第三章、命名规则一、函数命名规则格式以下:序号阐明字体选择备注1模块名称大写必选以最直观模式给顾客辨别不同的模块函数,采用模块英文名称或者简写2下划线必选间隔符3函数动作首字母大写必选动作英文名称或者简写,最多2个单词4函数对象首字母大写可选对象英文名称或者简写,最多2个单词5函数范畴首字母大写可选范畴英文名称或者简写,最多2个单词例如:LCD_DispWord,表达液晶模块显示中文函数命名的一种重要原则是望文知意(其别人看到函数名就大致懂得函数功效),必须考虑命名的精确性,命名体现函数的功效,而不要体现函数的实现办法。二、变量命名规则局部变量命名:格式以下:序号阐明字体选择备注1变量类型简写小写必选以最直观模式给顾客辨别不同的变量类型,最多2个字母长度,具体参考《附录A惯用变量类型及简写》2变量修饰首字母大写可选修饰词英文名称或者简写,最多2个单词3变量名称首字母大写必选名称英文名称或者简写,最多2个单词例如:ucharucCurrentValue;表达无符号类型,现在值数组变量命名时在局部变量类型前增加前缀字母“a”。例如:ucharaucSendBuff[10];指针变量命名时在局部变量类型前增加前缀字母“p”。例如:uchar*pucReceiveBuff[10];全局变量命名时在局部变量类型前增加前缀字母“g”和下划线。静态变量命名时在局部变量类型前增加前缀字母“s”和下划线。三、宏命名规则格式以下:序号阐明字体选择备注1模块名称大写必选以最直观模式给顾客辨别不同的模块宏,采用模块英文名称或者简写2下划线必选间隔符3功效名称大写必选功效英文名称或者简写,最多2个单词4下划线可选间隔符5修饰词大写可选修饰词英文名称或者简写,最多2个单词例如:#defineTMP_BUFF_MAX 256 //缓冲区最大长度四、文献命名规则格式以下(全部小写):序号阐明字体选择备注1模块名称小写必选采用模块英文名称或者简写2下划线可选_3分类名称小写可选分类英文名称或者简写4顿号必选.5文献类型小写必选代码文献(c),头文献(h)例如:液晶模块:lcd_driver.clcd_driver.hlcd_fonts.clcd_fonts.h按键模块:key.ckey.h五、新定义变量类型命名规则新定义变量类型对变量进行命名时能够提出2个与其它类型不相似的字母前缀来表达,并在文献开始或者新类型定义时进行阐明。六、命名注意事项:1、标记符命名基本原则标记符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本能够理解的缩写,避免使人产生误解。尽量采用英文命名,不能够用汉语拼音。标记符的长度应当符合“min-length&&max-information”原则。阐明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;某些单词有大家公认的缩写。参考《附录B惯用单词及缩写》2、命名中若使用特殊商定或缩写,则要有注释阐明阐明:应当在源文献的开始之处,对文献中所使用的缩写或商定,特别是特殊的缩写,进行必要的注释阐明。3、局部循环变量也必须按照变量命名规则来定义阐明:变量,特别是局部变量,如果用单个字符表达,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而耗费大量的查错时间。4、不要用数字或较奇怪的字符来定义标记符示例:以下命名,使人产生疑惑。#defineEXAMPLE_0_TEST#defineEXAMPLE_1_TESTvoidTMP_SetSls00(ucharucSls);应改为故意义的单词命名#defineEXAMPLE_UNIT_TEST#defineEXAMPLE_ASSERT_TESTvoidTMP_SetUdtMsgSls(ucharucSls);5、用对的的反义词组命名含有互斥意义的变量或相反动作的函数等阐明:可参考《附录C常见反义词组》下面是某些在软件中惯用的反义词组。示例:uintuiMinSum;uintuiMaxSum;uintTMP_AddUser(uchar*pucUserName);uintTMP_DeleteUser(uchar*pucUserName);6、避免使用下列划线开始和结尾的定义除了编译开关/头文献等特殊应用,应避免使用_EXAMPLE_TEST_之类下列划线开始和结尾的定义7、程序中不要出现仅靠大小写辨别的相似的标记符例如:uintuix,uiX;//变量x与X容易混淆voidTMP_foo(uintuiX);//函数foo与FOO容易混淆voidTMP_FOO(floatfX);8、标记符缩写命名时尽量不使用单词缩写,如果单词太长必须缩写,应当省略其中的元音字母,方便望文知意,如packet_header缩写为pkt_hdr,而不要缩写为pack_h。惯用单词缩写见《附录B惯用单词及缩写》9、函数名应精确描述函数的功效10、避免使用无意义或含义不清的动词为函数命名阐明:避免用含义不清的动词如process、handle等为函数命名,由于这些动词并没有阐明要具体做什么。第四章、代码书写规范一、基本原则制订规范的基本目的就是加强代码的可维护性,也就是说代码必须易于阅读,易于理解,易于测试,易于移植。全部的代码必须采用ANSIC,原则函数原型必须采用ANSIC原则。保持代码语句和构造简朴清晰,避免使用复杂语句。二、排版1、缩进风格程序块要采用缩进风格编写,缩进的空格数为4个。预解决语句、全局数据、函数原型、标题、附加阐明、函数阐明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐。2、不要使用【TAB】键 【TAB】键在不同编辑器和打印机上因所设立空格数目不同而造成程序布局不整洁,从而造成代码缩排混乱。能够采用空格键来替代,4个空格替代一种【TAB】键。如果采用SourceInsight软件,能够设立按【TAB】键后自动用4个空格键替代。3、空行相对独立的程序块之间、变量阐明之后必须加空行。程序文献构造各部分之间空两行,若不必要也可只空一行,各函数实现之间普通空两行示例:以下例子不符合规范。if((ucCount==1)&&(ucRetCode==1)){if(ucStatus=='1'){*pucErrCode=0;returnEPRONTCENTER;}}if((ucCount==1)&&(ucRetCode==0)){*pucErrCode=EPRONTCENTER;returnEPRONTCENTER;}应以下书写:if((ucCount==1)&&(ucRetCode==1)){if(ucStatus=='1'){*pucErrCode=0;returnEPRONTCENTER;}}if((ucCount==1)&&(ucRetCode==0)){*pucErrCode=EPRONTCENTER;returnEPRONTCENTER;}4、语句长度要不大于80个字符一行语句以不大于80字符为宜,不要写得过长。过多的代码会造成显示屏显示局限性,从而减少代码阅读速度,代码打印时也会造成打印局限性5、长语句换行较长的语句(>80字符)要分成多行书写,长体现式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行合适的缩进,使排版整洁,语句可读。 示例:stPermCountMsg.ucHead.ucLen=TMP_TO_STAT_PERM_COUNT_LEN+TMP_STAT_SIZE_PER_FRAM*sizeof(ulong);aucTaskTable[ucFrameId*TMP_STAT_TASK_CHECK_NUMBER+ucIndex]=astAtPoi[ucIndex].ucStatus;6、长体现式换行循环、判断等语句中若有较长的体现式或语句,则要进行适应的划分,长体现式要在低优先级操作符处划分新行,操作符放在新行之首。划分出的新行要进行合适的缩进,使排版整洁,语句可读。示例:if((ucTaskNo<TMP_MAX_TASK_NUMBER)&&(TMP_StatItemValid(ucStatItem))){...//programcode}for(i=0,j=0;(i<astBufferKeyword[ucWordIndex].ucWordLength)&&(j<stNewKeyword.ucWordLength);i++,j++){...//programcode}for(i=0,j=0;(i<usFirstWordLength)&&(j<ucSecondWordLength);i++,j++){...//programcode}7、若函数的参数较长,则要进行合适的划分8、一行只写一条语句不允许把多个短语句写在一行中,即一行只写一条语句示例:以下例子不符合规范。stRect.ucLength=0;stRect.ucWidth=0;应以下书写stRect.ucLength=0;stRect.ucWidth=0;9、括号{}if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。左大括号“{”后和右大括号“}”前不可出当代码,并且与引用他的语句左对齐。示例:以下例子不符合规范。if(pUserCR==NULL)return;应以下书写:if(pUserCR==NULL){return;}10、语句缩进规定函数的开始、构造的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的状况解决语句也要遵从语句缩进规定。预解决指令不需要缩进,总是从行首开始。即使预解决指令位于缩进代码块中,指令也应从行首开始示例:良好风格:预解决指令均从行首开始if(lopsided_score){#ifDISASTER_PENDING//Correct--StartsatbeginningoflineDropEverything();#ifNOTIFYNotifyClient();#endif#endifBackToNormal();}不良风格:缩进的预解决指令if(lopsided_score){#ifDISASTER_PENDING//Wrong!The"#if"shouldbeatbeginning//oflineDropEverything();#endif//Wrong!Donotindent"#endif"BackToNormal();}11、分界符程序块的分界符(如C/C++语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类的定义、构造的定义、枚举的定义以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。示例:以下例子不符合规范。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}应以下书写。for(...){...//programcode}if(...){...//programcode}voidexample_fun(void){...//programcode}12、空格在两个以上的核心字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系亲密的操作符(一元操作符,组员操作符,数组下标)后不应加空格。阐明:采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,因此,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号背面和右括号前面)不需要加空格,多重括号间不必加空格,由于在C/C++语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应当保持整体清晰,而在局部不加空格。给操作符留空格时不要持续留两个以上空格。(1)、核心字之后要留空格,以突出核心字。(2)、函数名之后不要留空格,紧跟左括号‘(’,以与核心字区别(3)、‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。(4)、‘,’之后要留空格,例如:Function(x,y,z)。(5)、如果‘;’不是一行的结束符号,其后要留空格例如:for(initialization;condition;update)(6)、赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加一种空格。if(current_time>=MAX_TIME_VALUE)a=b+c;a*=2;a=b^2;(7)、"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。*p='a';//内容操作"*"与内容之间flag=!isEmpty;//非操作"!"与内容之间p=&mem;//地址操作"&"与内容之间i++; //"++","--"与内容之间(8)、”[]”、"->"、"."前后不加空格。p->id=pid;//"->"指针前后不加空格(9)、指针定义符号*的前面加空格。char*get_string(){char*str;}(10)、对于体现式比较长的for语句和if语句,为了紧凑起见能够合适地去掉某些空格例如:for(i=0;i<10;i++)和if((a<=b)&&(c<=d))三、注释1、注释量普通状况下,源程序有效注释量必须在20%以上。阐明:注释的原则是有助于对程序的阅读理解,注释不适宜太多也不能太少,注释语言必须精确、易懂、简洁。 2、函数头部注释每个函数头部都应当进行注释,涉及函数实现的功效,参数阐明,返回值等。函数的头部注释要达成调用无需浏览函数,从注释区就能够理解该函数的全部信息。函数功效:该函数实现的具体功效,含有依赖关系的函数间在此进行阐明。参数:如果参数值为已知,能够在此具体列表阐明。如果函数有调用全局变量,也要在此进行具体阐明。返回:函数返回值,对不同的返回值要进行具体阐明。3、代码与注释同时修改边写代码边注释,修改代码同时修改对应的注释,以确保注释与代码的一致性。不再有用的注释要删除。4、注释的内容要清晰、明了,含义精确,避免注释二义性阐明:错误的注释不仅无益反而有害。5、避免在注释中使用缩写,特别是非惯用缩写阐明:在使用缩写时或之前,应对缩写进行必要的阐明。6、注释书写位置注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。示例:以下例子不符合规范。例1://getreplicatesubsystemindexandnetindicatorucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;例2:ucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;//getreplicatesubsystemindexandnetindicator应以下书写//getreplicatesubsystemindexandnetindicatorucRepssnInd=aucSsnData[ucIndex].ucRepssnIndex;ucRepssnNi=aucSsnData[ucIndex].ucNi;7、变量、常量命名不能充足自注释的,必须加以注释对于全部有物理含义的变量、常量,如果其命名不是充足自注释的,在声明时都必加注释,阐明其物理含义。变量、常量、宏的注释应放在其上方相邻位置或右方。示例://activestatistictasknumber#defineMAX_ACT_TASK_NUMBER1000#defineMAX_ACT_TASK_NUMBER1000//activestatistictasknumber8、数据构造命名不能充足自注释的,必须加以注释数据构造声明(涉及数组、构造、类、枚举等),如果其命名不是充足自注释的,必须加以注释。对数据构造的注释应放在其上方相邻位置,不可放在下面;对构造中的每个域的注释放在此域的右方。示例:可按以下形式阐明枚举/数据/联合构造。//sccpinterfacewithsccpuserprimitivemessagenameenumSCCP_USER_PRIMITIVE{N_UNITDATA_IND,//sccpnotifysccpuserunitdatacomeN_NOTICE_IND,//sccpnotifyusertheNo.7networkcannot//transmissionthismessageN_UNITDATA_REQ,//sccpuser'sunitdatatransmissionrequest};9、全局变量注释全局变量要有较具体的注释,涉及对其功效、取值范畴、以及存取时注意事项等的阐明。10、注释要与说描述的内容进行同样的缩排阐明:可使程序排版整洁,并方便注释的阅读与理解。示例:以下例子,排版不整洁,阅读稍感不方便。voidexample_fun(void){//codeonecommentsCodeBlockOne//codetwocommentsCodeBlockTwo}应改为以下布局。voidexample_fun(void){//codeonecommentsCodeBlockOne//codetwocommentsCodeBlockTwo}11、将注释与其上面的代码用空行隔开示例:以下例子,显得代码过于紧凑。//codeonecomments*/programcodeone//codetwocommentsprogramcodetwo应以下书写://codeonecommentsprogramcodeone//codetwocommentsprogramcodetwo12、持续case语句解决时,必须编写注释对于switch语句下的case语句,如果由于特殊状况需要解决完一种case后进入下一种case解决,必须在该case语句解决完、下一种case语句前加上明确的注释。阐明:这样比较清晰程序编写者的意图,有效避免无端遗漏break语句。示例(注意斜体加粗部分):caseCMD_UP:ProcessUp();break;caseCMD_DOWN:ProcessDown();break;caseCMD_FWD:ProcessFwd();if(...){...break;}else{ProcessCFW_B();//nowjumpintocaseCMD_A}caseCMD_A:ProcessA();break;caseCMD_B:ProcessB();break;caseCMD_C:ProcessC(); break;caseCMD_D:ProcessD();break;...13、代码或体现式的中间严禁插入注释阐明:除非必要,不应在代码或体现中间插入注释,否则容易使代码可理解性变差。14、通过对的命名使代码成为自注释的通过对函数或过程、变量、构造等对的的命名以及合理地组织代码的构造,使代码成为自注释的。阐明:清晰精确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释15、在代码的功效、意图层次上进行注释,提供有用、额外的信息阐明:注释的目的是解释代码的目的、功效和采用的办法,提供代码以外的信息,协助读者理解代码,避免没必要的重复注释信息。示例:以下注释意义不大。//ifreceive_flagisTRUEif(receive_flag)而以下的注释则给出了额外有用的信息。//ifmtpreceiveamessagefromlinksif(receive_flag)16、在程序块的结束行右方加注释标记,以表明某程序块的结束阐明:当代码段较长,特别是多重嵌套时,这样做能够使代码更清晰,更便于阅读。示例:参见以下例子。if(...){//programcode while(index<MAX_INDEX){//programcode}/*endofwhile(index<MAX_INDEX)*///指明该条while语句结束}/*endofif(...)*///指明是哪条if语句结束17、注释格式语句、变量定义、宏定义注释使用“//……”格式语句块、函数阐明使用“/*……*/”格式。18、采用中文注释注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利精确的英文体现。阐明:注释语言不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用中文。19、使用#if0和#endif注释代码块使用#if0和#endif注释代码块。例如:来注释一段较大的代码#if0#defineDISP_TBL_SIZE5//Sizeofdisplaybuffertable#defineDISP_MAX_X80//Max.numberofcharactersinXaxis#defineDISP_MAX_Y25//Max.numberofcharactersinYaxis#defineDISP_MASK0x5F#endif20、注释不能嵌套四、代码可读性1、使用小括号明确体现式的操作次序注意运算符的优先级,并用括号明确体现式的操作次序,避免使用默认优先级。阐明:避免阅读程序时产生误解,避免因默认的优先级与设计思想不符而造成程序出错。示例:下列语句中的体现式word=(high<<8)|low(1)if((a|b)&&(a&c))(2)if((a|b)<(c&d))(3)如果书写为high<<8|lowa|b&&a&ca|b<c&d由于high<<8|low=(high<<8)|low,a|b&&a&c=(a|b)&&(a&c),(1)(2)不会出错,但语句不易理解;a|b<c&d=a|(b<c)&d,(3)造成了判断条件出错。2、用故意义的枚举和宏替代数字避免使用不易理解的数字,用故意义的标记来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用故意义的枚举或宏来替代。示例:以下的程序可读性差。if(Trunk[index].trunk_state==0){Trunk[index].trunk_state=1;...//programcode}应改为以下形式: #defineTRUNK_IDLE0#defineTRUNK_BUSY1if(Trunk[index].trunk_state==TRUNK_IDLE){Trunk[index].trunk_state=TRUNK_BUSY;...//programcode}3、源程序中关系较为紧密的代码应尽量相邻阐明:便于程序阅读和查找。示例:下列代码布局不太合理。rect.length=10;char_poi=str;rect.width=5;若按以下形式书写,可能更清晰某些。rect.length=10;rect.width=5;//矩形的长与宽关系较亲密,放在一起。char_poi=str;4、用多行简朴语句替代复杂语句不要使用难懂的技巧性很高的语句,除非很有必要时。阐明:高技巧语句不等于高效率的程序,事实上程序的效率核心在于算法。示例:以下体现式,考虑不周就可能出问题,也较难理解。*stat_poi+++=1;*++stat_poi+=1;应分别改为以下。*stat_poi+=1;stat_poi++;//此二语句功效相称于“*stat_poi+++=1;”++stat_poi;*stat_poi+=1;//此二语句功效相称于“*++stat_poi+=1;五、变量,构造 1、公共变量1.1、去掉没必要的公共变量阐明:公共变量是增大模块间耦合的因素之一,故应减少没必要的公共变量以减少模块间的耦合度。1.2、认真定义并明确公共变量的含义、作用、取值范畴及公共变量间的关系阐明:在对变量声明的同时,应对其含义、作用及取值范畴进行注释阐明,同时若有必要还应阐明与其它变量的关系。1.3、明确公共变量与操作此公共变量的函数或过程的关系 明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创立等。阐明:明确过程操作变量的关系后,将有助于程序的进一步优化、单元测试、系统联调以及代码维护等。这种关系的阐明可在注释或文档中描述。示例:在源文献中,可按以下注释形式阐明。RELATIONSystem_InitInput_RecPrint_RecStat_ScoreStudentCreateModifyAccessAccessScoreCreateModifyAccessAccess,Modify注:RELATION为操作关系;System_Init、Input_Rec、Print_Rec、Stat_Score为四个不同的函数;Student、Score为两个全局变量;Create表达创立,Modify表达修改,Access表达访问。其中,函数Input_Rec、Stat_Score都可修变化量Score,故此变量将引发函数间较大的耦合,并可能增加代码测试、维护的难度。1.4、要谨慎向公共变量传递数据当向公共变量传递数据时,要十分小心,避免赋与不合理的值或越界等现象发生。阐明:对公共变量赋值时,若有必要应进行正当性检查,以提高代码的可靠性、稳定性。1.5、避免局部变量与公共变量同名。阐明:若使用了较好的命名规则,那么此问题可自动消除。1.6、公共变量仅由模块或函数创立和修改,其它模块和函数只能访问构造仅有一种模块或函数能够修改、创立,而其它有关模块或函数只访问的公共变量,避免多个不同模块或函数都能够修改、创立同一公共变量的现象。阐明:减少公共变量耦合度。2、局部变量2.1、严禁使用未经初始化的变量作为右值阐明:特别是在C/C++中引用未经赋值的指针,经常会引发系统崩溃。2.2、不使用与硬件或软件环境关系亲密的变量使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系亲密的变量。阐明:使用原则的数据类型,有助于程序的移植。2.3、变量声明时,同一类型,不同意义的多个变量,要分行,便于辨别示例:下列代码中,i,j,k是临时循环变量,与有实际意义的lenth,width放一起不太合理。intlength,width,i,j,k;若按以下形式书写,可能更清晰某些。intlength,width;inti,j,k;2.4、对只设立一次的变量,宜使用“const”限定词进行声明2.5、避免在函数中使用static局部变量尽量避免函数带有“记忆”功效,相似的输入应当产生相似的输出。带有“记忆”功效的函数,其行为可能是不可预测的,由于它的行为可能取决于某种“记忆状态”。这样的函数既不易理解又不利于测试和维护。3、数组3.1、数组大小及初始值要明拟定义数组初始化不要采用系统默认值,最佳能够采用初始化语句来完毕3.2、数组、构造和联合的初始化列表应显式描述数组、构造和联合的初始化列表应使用大括号,并使用附加的大括号来批示嵌套的构造;程序员应显式地考虑和描述复杂数据类型的全部元素,不应无视某个元素的初始化。例如:错误使用方法int16_ty[3][2]={1,2,3,4,5,6};int16_ty[3][2]={{1,2}};对的使用方法:int16_ty[3][2]={{1,2},{3,4},{54、构造、联合4.1、构造的功效要单一,是针对一种事务的抽象阐明:设计构造时应力求使构造代表一种现实事务的抽象,而不是同时代表多个。构造中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一构造中。示例:以下构造不太清晰、合理。typedefstructSTUDENT_STRU{unsignedcharaucName[8];//student'snameunsignedcharucAge;//student'sageunsignedcharucSex;//student'ssex,asfollows//0-FEMALE;1-MALEunsignedcharaucTeacherName[8];//thestudentteacher'snameunisgnedcharucTeacherSex;//histeachersex}STUDENT;若改为以下,可能更合理些。typedefstructTEACHER_STRU{unsignedcharaucName[8];//teachernameunisgnedcharucSex;//teachersex,asfollows//0-FEMALE;1-MALE}TEACHER;typedefstructSTUDENT_STRU{unsignedcharaucName[8];//student'snameunsignedcharucAge;//student'sageunsignedcharucSex;//student'ssex,asfollows//0-FEMALE;1-MALEunsignedintucTeacherInd;//histeacherindex}STUDENT;4.2、不要设计面面俱到、非常灵活的数据构造阐明:面面俱到、灵活的数据构造反而容易引发误解和操作困难。4.3、不同构造间的关系不要过于复杂阐明:若两个构造间关系较复杂、亲密,那么应合为一种构造。示例:以下两个构造的构造不合理。typedefstructPERSON_ONE_STRU{unsignedcharaucName[8];unsignedcharaucAddr[40];unsignedcharucSex;unsignedcharucCity[15];}PERSON_ONE;typedefstructPERSON_TWO_STRU{unsignedcharaucName[8];unsignedcharucAge;unsignedcharucTel;}PERSON_TWO;由于两个构造都是描述同一事物的,那么不如合成一种构造。typedefstructPERSON_STRU{unsignedcharaucName[8];unsignedcharucAge;unsignedcharucSex;unsignedcharaucAddr[40];unsignedcharaucCity[15];unsignedcharucTel;}PERSON;4.4、构造中元素的个数应适中若构造中元素个数过多可考虑根据某种原则把元素构成不同的子构造,以减少原构造中元素的个数。阐明:增加构造的可理解性、可操作性和可维护性。示例:如果认为如上的_PERSON构造元素过多,那么能够下对之划分。typedefstructPERSON_BASE_INFO_STRU{unsignedcharucName[8];unsignedcharucAge;unsignedcharucSex;}PERSON_BASE_INFO;typedefstructPERSON_ADDRESS_STRU{unsignedcharucAddr[40];

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论