收藏 分销(赏)

软件设计标准规范.doc

上传人:二*** 文档编号:4710388 上传时间:2024-10-10 格式:DOC 页数:86 大小:918KB
下载 相关 举报
软件设计标准规范.doc_第1页
第1页 / 共86页
本文档共86页,全文阅读请下载到手机保存,查看更方便
资源描述
软件设计规范 制订: 审核: 同意: 文件编号 生效日期 版本号 分 发 部 门 修 订 履 历 序号 版本 修订内容 修订人 修订日期 会签和文件发放: 会签部门 会签人 会签日期 签收部门 签收人 签收日期 深圳市德卡科技 文件编号 文件版本 A1 生效日期 软件设计规范 发行类别 ■新增 □修订 发行部门 研发中心 目 录 第一章、项目模块划分 15 一、模块划分 15 二、模块命名 15 第二章、文件格式 15 一、c文件格式说明: 16 1、文件创建及修改说明区 16 2、头文件引用区 16 3、全局变量定义区 16 4、驱动函数区 16 5、应用函数区 17 6、文件结束说明 17 二、h文件格式说明 17 1、文件创建及修改说明区 17 2、防重调用定义 18 3、头文件引用 18 4、控制接口定义区 18 5、常量定义区 19 6、宏调用定义区 19 7、类型定义区 19 8、外部引用变量区 19 9、外部引用函数区 20 10、操作步骤说明区 20 11、文件结束说明 20 第三章、命名规则 21 一、函数命名规则 21 二、变量命名规则 21 三、宏命名规则 22 四、文件命名规则 22 五、新定义变量类型命名规则 22 六、命名注意事项: 22 1、标识符命名基础标准 23 2、命名中若使用特殊约定或缩写,则要有注释说明 23 3、局部循环变量也必需根据变量命名规则来定义 23 4、不要用数字或较奇怪字符来定义标识符 23 5、用正确反义词组命名含有互斥意义变量或相反动作函数等 23 6、避免使用以下划线开始和结尾定义 23 7、程序中不要出现仅靠大小写区分相同标识符 23 8、标识符缩写 24 9、函数名应正确描述函数功效 24 10、避免使用无意义或含义不清动词为函数命名 24 第四章、代码书写规范 24 一、基础标准 24 二、排版 24 1、缩进风格 24 2、不要使用【TAB】键 24 3、空行 24 4、语句长度要小于80个字符 25 5、长语句换行 25 6、长表示式换行 26 7、若函数参数较长,则要进行合适划分 26 8、一行只写一条语句 26 9、括号{} 27 10、语句缩进要求 27 11、分界符 28 12、空格 29 三、注释 30 1、注释量 30 2、函数头部注释 30 3、代码和注释同时修改 31 4、注释内容要清楚、明了,含义正确,预防注释二义性 31 5、避免在注释中使用缩写,尤其是很用缩写 31 6、注释书写位置 31 7、变量、常量命名不能充足自注释,必需加以注释 32 8、数据结构命名不能充足自注释,必需加以注释 32 9、全局变量注释 32 10、注释要和说描述内容进行一样缩排 32 11、将注释和其上面代码用空行隔开 33 12、连续case语句处理时,必需编写注释 34 13、代码或表示式中间严禁插入注释 36 14、经过正确命名使代码成为自注释 36 15、在代码功效、意图层次上进行注释,提供有用、额外信息 36 16、在程序块结束行右方加注释标识,以表明某程序块结束 36 17、注释格式 37 18、采取汉字注释 37 19、使用 #if0和 #endif注释代码块 37 20、注释不能嵌套 37 四、代码可读性 37 1、使用小括号明确表示式操作次序 37 2、用有意义枚举和宏替换数字 38 3、源程序中关系较为紧密代码应尽可能相邻 39 4、用多行简单语句替换复杂语句 39 五、变量,结构 40 1、公共变量 40 1.1、去掉没必需公共变量 40 1.2、仔细定义并明确公共变量含义、作用、取值范围及公共变量间关系 40 1.3、明确公共变量和操作此公共变量函数或过程关系 40 1.4、要谨慎向公共变量传输数据 40 1.5、预防局部变量和公共变量同名。 40 1.6、公共变量仅由模块或函数创建和修改,其它模块和函数只能访问 40 2、局部变量 41 2.1、严禁使用未经初始化变量作为右值 41 2.2、不使用和硬件或软件环境关系亲密变量 41 2.3、变量申明时,同一类型,不一样意义多个变量,要分行,便于区分 41 2.4、对只设置一次变量,宜使用“const”限定词进行申明 41 2.5、避免在函数中使用 static 局部变量 41 3、数组 41 3.1、数组大小及初始值要明确定义 41 3.2、数组、结构和联合初始化列表应显式描述 41 4、结构、联合 42 4.1、结构功效要单一,是针对一个事务抽象 42 4.2、不要设计面面俱到、很灵活数据结构 43 4.3、不一样结构间关系不要过于复杂 43 4.4、结构中元素个数应适中 44 4.5、结构体中元素布局 44 4.6、结构体设计要考虑兼容性 45 4.7、跨平台数据结构,要考虑字节次序及对齐问题 45 4.8、struct或union类型中最少应有一个组员 46 4.9、struct或union类型组员类型 46 5、枚举 47 5.1、枚举元素初始化应完整 47 6、自定义数据类型 47 6.1、合理地设计数据并使用自定义数据类型 47 6.2、自定义数据类型命名要合适 47 7、类型转换 47 7.1、谨慎使用数据类型强制转换 47 7.2、了解编译系统默认数据类型转换 47 7.3、应严禁 signed 类型和 unsigned 类型之间隐式转化 48 7.4、应严禁 int 类型和 float 类型隐式转化 48 8、指针 48 8.1、不应对指针变量使用强制类型转换赋值 48 8.2、不应把自动类型局部变量地址赋值给外部指针 48 8.3、指针指针不应超出两级 48 8.4、指向不一样数据类型指针之间不应相互转换 48 8.5、指针转换过程中不应丢失指针const、 volatile属性 48 8.6、只有指向数组指针才许可进行算术运算 48 8.7、只有指向同一数组两个指针才许可相减 49 8.8、只有指向同一数组两个指针才许可用>、>=、<和<=等关系运算符进行比较 49 8.9、指针索引值不应为负 50 8.10、不应对指针值可能为NULL指针进行算术运算 50 8.11、调用返回类型为指针函数后,应进行是否为空判定 50 8.12、局部变量地址不应在本对象消亡后传给另外一个对象 50 8.13、一个未知大小对象指针不应成为加法或减法操作左操作数 51 六、函数 51 1、函数编写标准 51 1.1、明确函数功效,正确(而不是近似)地实现函数设计 51 1.2、函数规模尽可能限制在200行以内 51 1.3、一个函数仅完成一件功效 51 1.4、为简单功效编写函数 51 1.5、不要设计多用途面面俱到函数 52 1.6、函数功效含有可估计性 52 1.7、函数功效含有独立性 52 1.8、预防函数出现随机内聚 53 1.9、功效不明确较小函数,能够无须存在 54 1.10、设计高扇入、合理扇出(小于7)函数 54 1.11、降低函数本身或函数间递归调用 54 1.12、降低函数间耦合度 54 2、函数参数 55 2.1、明确接口函数参数正当性检验者 55 2.2、预防将函数参数作为工作变量 55 2.3、避免设计多参数函数,不使用参数从接口中去掉 56 2.4、非调度函数应降低或预防控制参数,尽可能只使用数据参数 56 2.5、检验函数全部参数输入有效性 57 2.6、检验函数全部非参数输入有效性,如数据文件、公共变量等 57 2.7、调用函数时参数类型要一致 57 2.8、避免使用BOOL参数 57 2.9、在函数参数中不应使用static存放类标识符 57 2.10、函数参数数量 57 2.11、宜避免函数参数在调用中未被使用 57 3、函数返回 58 3.1、对所调用函数错误返回码要仔细、全方面地处理 58 3.2、函数返回值要清楚、明了,让使用者不轻易忽略错误情况 58 3.3、函数返回值要和赋值变量类型一致 58 3.4、对于提供了返回值函数,在引用时最好使用其返回值 58 3.5、函数只有一个出口 58 4、可重入函数 58 4.1、可重入函数使用局部变量 58 4.2、可重入函数使用全局变量 58 5、函数模块划分 59 5.1、仔细分析模块功效,进行函数划分和组织 59 5.2、假如多段代码反复做同一件事情,那么在函数划分上可能存在问题 59 5.3、函数内部代码结构次序 59 6、循环语句 60 6.1、循环控制变量类型应为整型 60 6.2、循环控制变量应为局部变量 61 6.3、for循环控制语句中3 个表示式只应和循环控制相关 61 6.4、for循环不宜只实施一次 61 7、判定语句 61 7.1、不要轻易用条件分支去替换逻辑表示式 61 7.2、switch语句中不应只包含default语句 61 7.3、全部非空switch case子句全部应以break 语句结束 61 7.4、switch控制表示式不应是一个常量或逻辑表示式 61 7.5、每一个switch语句全部应最少有一个case子句 61 7.6、case表示式类型应和switch控制表示式类型一致 61 7.7、case表示式大小不应超出switch控制表示式大小 61 8、赋值语句 62 8.1、尽可能不使用条件赋值语句 62 9、其它注意事项 62 9.1、避免函数中无须要语句,预防程序中垃圾代码 62 9.2、在多任务操作系统环境下编程,更要注意函数可重入性结构 62 9.3、将常见较长变量用宏替换 62 七、预处理 62 1、宏 62 1.1、用宏定义表示式时,要使用完备括号 62 1.2、将宏所定义多条表示式放在大括号中 63 1.3、使用宏时,不许可参数发生改变 63 1.4、函数类宏调用时参数要完整 64 2、条件编译 64 2.1、预处理语句“#if”和“#endif”不应分散在不一样文件之中 64 2.2、被包含文件中“#else”、“#elseif”、“#endif”不应和父文件中“#if” 匹配 64 2.3、“#if”表示式中使用宏应该已经被定义,而且“#if”表示式只能包含整型常量 64 2.4、宏假如需要被重定义,应该先用“#undef”解除前面定义 64 八、中止 64 1、中止服务程序不应有返回值 64 2、中止服务程序中不应使用printf()函数 64 3、对于中止中使用到非局部变量,在中止处理函数中应对其进行入栈保护 64 4、调用中止处理程序中变量要进行开关中止处理 64 5、对于开关中止,要注意成对匹配 64 6、中止服务程序代码要简单化 65 九、程序可测性 65 1、标准 65 1.1、统一调测开关及打印函数 65 1.2、统一打印信息串格式 65 1.3、正式软件产品中应把断言及其它调测代码去掉(即把相关调测开关关掉) 65 1.4、用调测开关切换软件DEBUG版和正式版 65 1.5、软件DEBUG版和发行版在实现功效上含有一致性 65 1.6、结构测试环境和测试用例 65 1.7、预先设计程序调测方法和手段及多种调测开关 65 1.8、调测开关应分为不一样等级和类型 66 2、断言 66 2.1、使用断言来发觉软件问题,提升代码可测性 66 2.2、用断言来检验程序正常运行时不应发生但在调测时有可能发生非法情况 67 2.3、不能用断言来检验最终产品肯定会出现且必需处理错误情况 67 2.4、对较复杂断言加上明确注释 67 2.5、用断言确定函数参数 67 2.6、用断言确保没有定义特征或功效不被使用 67 2.7、用断言对程序开发环境(OS/Compiler/Hardware)假设进行检验 68 2.8、编写防错程序,然后在处理错误以后可用断言宣告发生错误 68 十、程序效率 69 1、标准 69 1.1、编程时要常常注意代码效率 69 1.2、提升代码效率前提 69 1.3、局部效率应为全局效率服务 69 1.4、合理划分模块函数 69 1.5、不应花过多时间拼命地提升调用不很频繁函数代码效率 70 1.6、不要一味追求紧凑代码 70 1.7、不应存在实施不到代码 70 1.8、去掉没必需全局变量 70 2、方法 70 2.1、处理软件空间效率1 70 2.2、处理软件空间效率2 71 2.3、循环体内工作量最小化 71 2.4、仔细分析相关算法,并进行优化 72 2.5、仔细考查、分析系统及模块处理输入(如事务、消息等)方法,并加以改善 72 2.6、直接用汇编编写调用频繁或性能要求极高函数 72 2.7、在多重循环中,应将最忙循环放在最内层 72 2.8、尽可能降低循环嵌套层次 73 2.9、尽可能不在循环体内放置判定语句 73 2.10、尽可能用乘法或其它方法替换除法,尤其是浮点运算中除法 74 2.11、应注意switch-case语句使用 74 十一、程序质量 74 1、标准 74 1.1、代码质量确保优先标准 74 1.2、合理划分子模块,提升可移植性和可重用性 75 1.3、提供良好接口界面 75 1.4、系统含有一定容错能力 75 2、方法 75 2.1、认真处理程序所能碰到多种犯错情况 75 2.2、系统运行之初,要初始化相关变量及运行环境,预防未经初始化变量被引用 75 2.3、系统运行之初,要对加载到系统中数据进行一致性检验 75 2.4、严禁随意更改其它模块或系统相关设置和配置 75 2.5、不能随意改变和其它模块接口 75 2.6、预防内存操作越界 75 2.7、编程时,要预防差1错误 76 2.8、要时刻注意易混淆操作符 76 2.9、条件判定语句必需处理全部情况 76 2.10、不要用goto语句 77 2.11、尽可能全部采取标准语句和标准库函数 77 2.12、避免使用嵌入式汇编 77 2.13、精心结构算法,并对其性能、效率进行测试 77 2.14、对较关键算法最好使用其它算法来确定 77 2.15、时刻注意表示式是否会上溢、下溢 77 2.16、使用变量时要注意其边界值情况 77 2.17、注意程序代码是否超出系统相关限制 78 2.18、循环、分支层次不要超出五层 78 2.19、不要比较浮点数相等 78 2.20、关注共用体存放、对齐模式 78 2.21、头文件中不应有对象或函数定义 78 2.22、不应单独使用小写字母“l”或大写字母“O”作为变量名 78 2.23、函数申明时参数不应只有类型名没有标识符 78 2.24、不应对有符号数进行位运算 78 2.25、无格式字符型不应和负数常量和零比较 78 2.26、无符号值不应和负数常量比较 79 2.27、对变量进行移位操作应确保不会产生溢出和数据截短 79 2.28、不应在布尔表示式中使用赋值操作符 79 2.29、不应对布尔表示式进行算术或位运算 79 2.30、表示式值在任何求值次序下应保持一致 79 2.31、应避免去数可能为0情况出现 79 2.32、赋值运算符左操作数不应进行转换操作,而且应该是一个可更改对象 79 2.33、sizeof操作符不应用在有单边作用表示式上 79 2.34、留心具体语言及编译器处理不一样数据类型标准及相关细节 80 十二、代码代码编辑、编译、审查 80 1、打开编译器全部告警开关对程序进行编译 80 2、在产品软件(项目组)中,要统一编译开关选项 80 3、经过代码走读及审查方法对代码进行检验 80 4、测试部测试产品之前,应对代码进行抽查及评审 80 5、养成随时保留编写代码习惯 80 6、同产品软件(项目组)内,最好使用相同编辑器,并使用相同设置选项 80 7、要小心地使用编辑器提供块拷贝功效编程 80 8、合理地设计软件系统目录,方便开发人员使用 80 附录A 常见数据类型及简写 81 附录B 常见单词及缩写 82 附录C 常见反义词组 84 附录D 常见命名规则 86 一、匈牙利命名法 86 二、骆驼(Camel)命名法 86 三、帕斯卡(Pascal)命名法 86 四、下划线命名法 86 第一章、项目模块划分 一、模块划分 将整个项目根据功效进行模块划分,各个模块相互独立,每个模块由一系列c文件和h文件组成。简单功效模块采取一个c文件和h文件接口,复杂功效模块可能需要多个c文件和h文件。 二、模块命名 根据模块所实现功效英文名称或简写命名,全部采取小写字母,多于1个单词中间加下划线。比如: 模块 命名 说明 液晶 lcd.c lcd.h 液晶初始化,字符、汉字和图片显示 lcd_fonts.c lcd_fonts.h 液晶自定义字库 按键 key.c key.h 按键初始化,键值列表,取按键值 指示灯 led.c led.h 指示灯初始化,闪烁控制 数码管 ledseg.c ledseg.h 数码管初始化,数字显示,特殊字符显示 蜂鸣器 beep.c beep.h 蜂鸣器初始化,鸣叫控制 第二章、文件格式 一、c文件格式说明: 1、文件创建及修改说明区 关键包含: 企业信息:企业名称、企业网站。 创建信息:创建者名称,创建日期,最初版本号,文档内容描述。 修改信息:修改者名称,修改日期,修改后版本号,修改内容描述。 可参考模块《template.c》 说明:和硬件相关文件能够在此增加说明,如芯片型号等。 2、头文件引用区 关键包含: 系统头文件引用:文件名包含在尖括号中。 自定义头文件引用:文件名包含着双引号中。 可参考模块《template.c》 3、全局变量定义区 关键包含: 全局变量定义区说明注释行: 全局变量定义:要赋初值。 全局变量注释: 可参考模块《template.c》。 4、驱动函数区 关键包含: 驱动函数区说明注释行: 函数说明:包含函数说明,参数说明,返回值说明。 函数体: 可参考模块《template.c》 5、应用函数区 关键包含: 应用函数区说明注释行: 函数说明:包含函数功效说明,参数说明,返回值说明。 函数体: 可参考模块《template.c》 6、文件结束说明 关键包含: 文件结束说明:End Of File 可参考模块《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、文件结束说明 关键包含: 文件结束说明:End Of File 可参考模块《template.h》 第三章、命名规则 一、函数命名规则 格式以下: 序号 说明 字体 选择 备注 1 模块名称 大写 必选 以最直观模式给用户区分不一样模块函数,采取模块英文名称或简写 2 下划线 必选 间隔符 3 函数动作 首字母大写 必选 动作英文名称或简写,最多2个单词 4 函数对象 首字母大写 可选 对象英文名称或简写,最多2个单词 5 函数范围 首字母大写 可选 范围英文名称或简写,最多2个单词 比如:LCD_DispWord,表示液晶模块显示汉字 函数命名一个关键标准是望文知意(其它人看到函数名就大致知道函数功效),必需考虑命名正确性,命名表现函数功效,而不要表现函数实现方法。 二、变量命名规则 局部变量命名: 格式以下: 序号 说明 字体 选择 备注 1 变量类型 简写小写 必选 以最直观模式给用户区分不一样变量类型,最多2个字母长度,具体参考《附录A 常见变量类型及简写》 2 变量修饰 首字母大写 可选 修饰词英文名称或简写,最多2个单词 3 变量名称 首字母大写 必选 名称英文名称或简写,最多2个单词 比如:uchar ucCurrentValue; 表示无符号类型,目前值 数组变量命名时在局部变量类型前增加前缀字母“a”。比如:uchar aucSendBuff[10]; 指针变量命名时在局部变量类型前增加前缀字母“p”。比如:uchar *pucReceiveBuff[10]; 全局变量命名时在局部变量类型前增加前缀字母“g”和下划线。 静态变量命名时在局部变量类型前增加前缀字母“s”和下划线。 三、宏命名规则 格式以下: 序号 说明 字体 选择 备注 1 模块名称 大写 必选 以最直观模式给用户区分不一样模块宏,采取模块英文名称或简写 2 下划线 必选 间隔符 3 功效名称 大写 必选 功效英文名称或简写,最多2个单词 4 下划线 可选 间隔符 5 修饰词 大写 可选 修饰词英文名称或简写,最多2个单词 比如:#define TMP_BUFF_MAX 256 //缓冲区最大长度 四、文件命名规则 格式以下(全部小写): 序号 说明 字体 选择 备注 1 模块名称 小写 必选 采取模块英文名称或简写 2 下划线 可选 _ 3 分类名称 小写 可选 分类英文名称或简写 4 顿号 必选 . 5 文件类型 小写 必选 代码文件(c),头文件(h) 比如: 液晶模块:lcd_driver.c lcd_driver.h lcd_fonts.c lcd_fonts.h 按键模块:key.c key.h 五、新定义变量类型命名规则 新定义变量类型对变量进行命名时能够提出2个和其它类型不相同字母前缀来表示,并在文件开始或新类型定义时进行说明。 六、命名注意事项: 1、标识符命名基础标准 标识符命名要清楚、明了,有明确含义,同时使用完整单词或大家基础能够了解缩写,避免使人产生误解。 尽可能采取英文命名,不能够用汉语拼音。标识符长度应该符合“min-length && max-information”标准。 说明:较短单词可经过去掉“元音”形成缩写;较长单词可取单词头多个字母形成缩写;部分单词有大家公认缩写。参考《附录B 常见单词及缩写》 2、命名中若使用特殊约定或缩写,则要有注释说明 说明:应该在源文件开始之处,对文件中所使用缩写或约定,尤其是特殊缩写,进行必需注释说明。 3、局部循环变量也必需根据变量命名规则来定义 说明:变量,尤其是局部变量,假如用单个字符表示,很轻易敲错(如i写成j),而编译时又检验不出来,有可能为了这个小小错误而花费大量查错时间。 4、不要用数字或较奇怪字符来定义标识符 示例:以下命名,使人产生迷惑。 #define EXAMPLE_0_TEST #define EXAMPLE_1_TEST void TMP_SetSls00( uchar ucSls ); 应改为有意义单词命名 #define EXAMPLE_UNIT_TEST #define EXAMPLE_ASSERT_TEST void TMP_SetUdtMsgSls(uchar ucSls ); 5、用正确反义词组命名含有互斥意义变量或相反动作函数等 说明:可参考《附录C 常见反义词组》下面是部分在软件中常见反义词组。 示例: uint uiMinSum; uint uiMaxSum; uint TMP_AddUser( uchar *pucUserName ); uint TMP_DeleteUser(uchar *pucUserName ); 6、避免使用以下划线开始和结尾定义 除了编译开关/头文件等特殊应用,应避免使用_EXAMPLE_TEST_之类以下划线开始和结尾定义 7、程序中不要出现仅靠大小写区分相同标识符 比如:   uint uix, uiX;     // 变量x 和 X 轻易混淆   void TMP_foo(uint uiX);  // 函数foo 和FOO轻易混淆   void TMP_FOO(float fX); 8、标识符缩写 命名时尽可能不使用单词缩写,假如单词太长必需缩写,应该省略其中元音字母,方便望文知意,如packet_header缩写为pkt_hdr,而不要缩写为pack_h。 常见单词缩写见《附录B 常见单词及缩写》 9、函数名应正确描述函数功效 10、避免使用无意义或含义不清动词为函数命名 说明:避免用含义不清动词如process、handle等为函数命名,因为这些动词并没有说明要具体做什么。 第四章、代码书写规范 一、基础标准 制订规范基础目标就是加强代码可维护性,也就是说代码必需易于阅读,易于了解,易于测试,易于移植。全部代码必需采取ANSI C,标准函数原型必需采取ANSI C 标准。保持代码语句和结构简单清楚,避免使用复杂语句。 二、排版 1、缩进风格 程序块要采取缩进风格编写,缩进空格数为4个。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块“{”“}”配对对齐,并和其前一行对齐。 2、不要使用【TAB】键 【TAB】键在不一样编辑器和打印机上因所设置空格数目不一样而造成程序布局不整齐,从而造成代码缩排混乱。能够采取空格键来替换,4个空格替换一个【TAB】键。 假如采取Source Insight软件,能够设置按【TAB】键后自动用4个空格键替换。 3、空行 相对独立程序块之间、变量说明以后必需加空行。程序文件结构各部分之间空两行,若无须要也可只空一行,各函数实现之间通常空两行 示例:以下例子不符合规范。 if ((ucCount == 1) && (ucRetCode == 1)) { if (ucStatus == '1') { *pucErrCode = 0; return EPRONTCENTER; } } if ((ucCount == 1) && (ucRetCode == 0)) { *pucErrCode = EPRONTCENTER; return EPRONTCENTER; } 应以下书写: if ((ucCount == 1) && (ucRetCode == 1)) { if (ucStatus == '1') { *pucErrCode = 0; return EPRONTCENTER; } } if ((ucCount == 1) && (ucRetCode == 0)) { *pucErrCode = EPRONTCENTER; return EPRONTCENTER; } 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))) { ... // program code } for (i=0, j=0; (i < astBufferKeyword[ucWordIndex].ucWordLength) && (j < stNewKeyword.ucWordLength); i++, j++) { ... // program code } for (i=0, j=0; (i < usFirstWordLength) && (j < ucSecondWordLength); i++, j++) { ... // program code } 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) { #if DISASTER_PENDING // Correct -- Starts at beginning of line DropEverything(); #if NOTIFY NotifyClient(); #endif #endif BackToNormal(); } 不良风格:缩进预处理指令 if (lopsided_score) { #if DISASTER_PENDING // Wrong! The "#if" should be at beginning //of line DropEverything(); #endif // Wrong! Do not indent "#endif" BackToNormal(); }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 品牌综合 > 行业标准/行业规范

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服