软件编程规范总则 CHECKLIST 检查人 检查日期:1999年月日 审查内容: 审查结果:通过口不通过口 序 总则条款 执行情况 说明 1排版 1-1:程序块要采用缩进风格编写,缩进的空格是[]否]兔1 数为4个 1-2:相对独立的程序块之间、变量说明之后必是 须加空行 3:较长的语句(>80字符)要分成多行书写[】翻]知 长表达式要在低优先级操作符处划分新行,操作 符放在新行之首,划分出的新行要进行适当的缩 进,使排版整齐,语句可读 41-4:循环、判断等语句中着有较长的表达式或是[】】知 语句,则要进行适应的划分,长表达式要在低优 先级操作符处划分新行,操作符放在新行之首 515:若函数或过程中的参数较长,则要进行】」兔门 当的划分 1-6不允许把多个短语句写在一行中,即一知门 只写一条语句。 717:f、 while、for、 default、d等语句自占是】】兔 1-8:对齐只使用空格键,不使用TAB键 1-9:函数或过程的开始、结构的定义及循环、 是[]否[]兔 判断等语句中的代码都要采用缩进风格,case语 句下的情况处理语句也要遵从语句缩进要求
软件编程规范总则 CHECKLIST 检 查 人:________________ 检查日期:1999 年_____月_____日 审查内容:____________________________________________________________________ 审查结果:通过□ 不通过□ 说 明:____________________________________________________________________ 序 号 总 则 条 款 执行情况 说明 1 排版 1 ¹1-1:程序块要采用缩进风格编写,缩进的空格 数为4个。 是[ ] 否[ ] 免[ ] 2 ¹1-2:相对独立的程序块之间、变量说明之后必 须加空行。 是[ ] 否[ ] 免[ ] 3 ¹1-3:较长的语句(>80字符)要分成多行书写, 长表达式要在低优先级操作符处划分新行,操作 符放在新行之首,划分出的新行要进行适当的缩 进,使排版整齐,语句可读。 是[ ] 否[ ] 免[ ] 4 ¹1-4:循环、判断等语句中若有较长的表达式或 语句,则要进行适应的划分,长表达式要在低优 先级操作符处划分新行,操作符放在新行之首。 是[ ] 否[ ] 免[ ] 5 ¹1-5:若函数或过程中的参数较长,则要进行适 当的划分。 是[ ] 否[ ] 免[ ] 6 ¹1-6:不允许把多个短语句写在一行中,即一行 只写一条语句。 是[ ] 否[ ] 免[ ] 7 ¹1-7:if、while、for、default、do等语句自占 一行。 是[ ] 否[ ] 免[ ] 8 ¹1-8:对齐只使用空格键,不使用TAB键。 是[ ] 否[ ] 免[ ] 9 ¹1-9:函数或过程的开始、结构的定义及循环、 判断等语句中的代码都要采用缩进风格,case语 句下的情况处理语句也要遵从语句缩进要求。 是[ ] 否[ ] 免[ ]
序 总则条款 执行情况 说明 号 101-10:程序块的分界符(如C/C+语言的大括号是[]否】 {和“}’)应各独占一行并且位于同一列 同时与引用它们的语句左对齐。在函数体的开 始、类的定义、结构的定义、枚举的定义以及if for、do、 while0、 switch、case语句中的程序 都要采用如上的缩进方式 |11:两个以上的关键字、变量、常量进行对是】】知 等操作时,它们之间的操作符之前、之后或者前 后要加空格;进行非对等操作时,如果是关系密 切的立即操作符(如一>),后不应加空格 注释 2-1:一般情况下,源程序有效注释量必须在20{是[]否】免1 以上。 2:说明性文件(如头文件h文件、c是否】兔 件、,def文件、编译说明文件,cfg等)头部应进 行注释,注释必须列出:版权说明、版本号、生 成日期、作者、内容、功能、与其它文件的关系、 修改日志等,头文件的注释中还应有函数功能简 23:文件头部应进行注释,列出:版权说明是[】翻】知 版本号、生成日期、作者、模块目的/功能、主 要函数及其功能、修改日志等 2-4:函数头部应进行注释,列出:函数的目的 功能、输入参数、输出参数、返回值、调用关系 (函数、表)等 5:边写代码边注释,修改代码同时修改相是都 的注释,以保证注释与代码的一致性。不再有用 的注释要删除。 ②-6;注释的内容要清楚、明了,含义准确,防A】免 止注释二义性 2-7:避免在注释中使用缩写,特别是非堂田是[]否[]免1 8:注释应与其描述的代码相近,对代码的是 释应放在其上方或右方(对单条语句的注释)相 邻位置,不可放在下面,如放于上方则需与其上 面的代码用空行隔开
序 号 总 则 条 款 执行情况 说明 10 ¹1-10:程序块的分界符(如C/C++语言的大括号 ‘{’和‘}’)应各独占一行并且位于同一列, 同时与引用它们的语句左对齐。在函数体的开 始、类的定义、结构的定义、枚举的定义以及if、 for、do、while0、switch、case语句中的程序 都要采用如上的缩进方式。 是[ ] 否[ ] 免[ ] 11 ¹1-11:在两个以上的关键字、变量、常量进行对 等操作时,它们之间的操作符之前、之后或者前 后要加空格;进行非对等操作时,如果是关系密 切的立即操作符(如->),后不应加空格。 是[ ] 否[ ] 免[ ] 2 注释 ¹2-1:一般情况下,源程序有效注释量必须在20% 以上。 是[ ] 否[ ] 免[ ] ¹2-2:说明性文件(如头文件.h文件、.inc文 件、.def文件、编译说明文件.cfg等)头部应进 行注释,注释必须列出:版权说明、版本号、生 成日期、作者、内容、功能、与其它文件的关系、 修改日志等,头文件的注释中还应有函数功能简 要说明。 是[ ] 否[ ] 免[ ] ¹2-3:源文件头部应进行注释,列出:版权说明、 版本号、生成日期、作者、模块目的/功能、主 要函数及其功能、修改日志等。 是[ ] 否[ ] 免[ ] ¹2-4:函数头部应进行注释,列出:函数的目的/ 功能、输入参数、输出参数、返回值、调用关系 (函数、表)等。 是[ ] 否[ ] 免[ ] ¹2-5:边写代码边注释,修改代码同时修改相应 的注释,以保证注释与代码的一致性。不再有用 的注释要删除。 是[ ] 否[ ] 免[ ] ¹2-6:注释的内容要清楚、明了,含义准确,防 止注释二义性。 是[ ] 否[ ] 免[ ] ¹2-7:避免在注释中使用缩写,特别是非常用缩 写。 是[ ] 否[ ] 免[ ] ¹2-8:注释应与其描述的代码相近,对代码的注 释应放在其上方或右方(对单条语句的注释)相 邻位置,不可放在下面,如放于上方则需与其上 面的代码用空行隔开。 是[ ] 否[ ] 免[ ]
序 总则条款 执行情况 说明 号 2-9:对于所有有物理含义的变量、常量,如果 是[]否[]免] 其命名不是充分自注释的,在声明时都必须加以 注释,说明其物理含义。变量、常量、宏的注释 应放在其上方相邻位置或右方 2-10:数据结构声明(包括数组、结构、类、枚 是[]否[]免[] 举等),如果其命名不是充分自注释的,必须加 以注释。对数据结构的注释应放在其上方相邻位 置,不可放在下面:对结构中的每个域的注释放 在此域的右方。 2119局变量要有较详细的注释,包括对其功是[1否】知 能、取值范围、哪些函数或过程存取它以及存取 时注意事项等的说明 2-12:注释与所描述内容进行同样的缩排。是[]香】知 12-13:将注释与其上面的代码用空行隔开。 214:对变量的定义和分支语句(条件分支、是[1否】知 环语句等)必须编写注释。 215:对于sWth语句下的cas语句,如果因为是[1否】知 特殊情况需要处理完一个case后进入下一个 case处理,必须在该case语句处理完、下一个 case语句前加上明确的注释, 3标识符命名 3-1:标识符的命名要清晰、明了,有明确含义 同时使用完整的单词或大家基本可以理解的缩 写,避免使人产生误解 吗9-2:命名中若使用特殊约定或缩写,则要是否]兔 释说明。 3-3:自己特有的命名风格,要自始至终保持是]免 致,不可来回变化 3-4:对于变量命名,禁止取单个字符(如、j是[]否[1免1 k..),建议除了要有具体含义外,还能表明其 变量类型、数据类型等,但i、j、k作局部循环 变量是允许的 3-5:命名规范必须与所使用的系统风格保持是[]否免门 致,并在同一项目中统一,比如采用UNIX的全小 写加下划线的风格或大小写混排的方式,不要使 用大小写与下划线混排的方式
序 号 总 则 条 款 执行情况 说明 ¹2-9:对于所有有物理含义的变量、常量,如果 其命名不是充分自注释的,在声明时都必须加以 注释,说明其物理含义。变量、常量、宏的注释 应放在其上方相邻位置或右方。 是[ ] 否[ ] 免[ ] ¹2-10:数据结构声明(包括数组、结构、类、枚 举等),如果其命名不是充分自注释的,必须加 以注释。对数据结构的注释应放在其上方相邻位 置,不可放在下面;对结构中的每个域的注释放 在此域的右方。 是[ ] 否[ ] 免[ ] ¹2-11:全局变量要有较详细的注释,包括对其功 能、取值范围、哪些函数或过程存取它以及存取 时注意事项等的说明。 是[ ] 否[ ] 免[ ] ¹2-12:注释与所描述内容进行同样的缩排。 是[ ] 否[ ] 免[ ] ¹2-13:将注释与其上面的代码用空行隔开。 是[ ] 否[ ] 免[ ] ¹2-14:对变量的定义和分支语句(条件分支、循 环语句等)必须编写注释。 是[ ] 否[ ] 免[ ] ¹2-15:对于switch语句下的case语句,如果因为 特殊情况需要处理完一个case后进入下一个 case处理,必须在该case语句处理完、下一个 case语句前加上明确的注释。 是[ ] 否[ ] 免[ ] 3 标识符命名 ¹3-1:标识符的命名要清晰、明了,有明确含义, 同时使用完整的单词或大家基本可以理解的缩 写,避免使人产生误解。 是[ ] 否[ ] 免[ ] ¹3-2:命名中若使用特殊约定或缩写,则要有注 释说明。 是[ ] 否[ ] 免[ ] ¹3-3:自己特有的命名风格,要自始至终保持一 致,不可来回变化。 是[ ] 否[ ] 免[ ] ¹3-4:对于变量命名,禁止取单个字符(如i、j、 k...),建议除了要有具体含义外,还能表明其 变量类型、数据类型等,但i、j、k作局部循环 变量是允许的。 是[ ] 否[ ] 免[ ] ¹3-5:命名规范必须与所使用的系统风格保持一 致,并在同一项目中统一,比如采用UNIX的全小 写加下划线的风格或大小写混排的方式,不要使 用大小写与下划线混排的方式。 是[ ] 否[ ] 免[ ]
序 总则条款 执行情况 说明 号 4可读性 41注意运算符的优先级,并用括号明确表达是[1香】知 式的操作顺序,避免使用默认优先级。 -2:避免使用不易理解的数字,用有意义的标 是[ 识来替代。涉及物理状态或者含有物理意义的常 量,不应直接使用数字,必须用有意义的枚举或 宏来代替 5变量 5-1:去掉没必要的公共变量。 是[]否[]免] 15-2:仔细定义并明确公共变量的含义、作用 取值范围及公共变量间的关系 5-3:明确公共变量与操作此公共变量的函数或 过程的关系,如访问、修改及创建等 5-4:当向公共变量传递数据时,要十分小心, 防止赋与不合理的值或越界等现象发生。 15-5:防止局部变量与公共变量同名 15-6:严禁使用未经初始化的变量作为右值。 6函数、过程 6-1:对所调用函数的错误返回码要仔细全面是】】知 地处理 6-23明确函数功能,精确(而不是近似)地实是 现函数设计 否]免] 6-3:编写可重入函数时,应注意局部变量的使是[]否1免1 用(如编写C/C++语言的可重入函数时,应使用 auto即缺省态局部变量或寄存器变量)。 6-4:编写可重入函数时,若使用全局变量,则是]免 应通过关中断、信号量(即P、V操作)等手段对 其加以保护 7可测性 7-1:在同一项目组或产品组内,要有一套统是「】都】免 的为集成测试与系统联调准备的调测开关及相 应打印函数,并且要有详细的说明
序 号 总 则 条 款 执行情况 说明 4 可读性 ¹4-1:注意运算符的优先级,并用括号明确表达 式的操作顺序,避免使用默认优先级。 是[ ] 否[ ] 免[ ] ¹4-2:避免使用不易理解的数字,用有意义的标 识来替代。涉及物理状态或者含有物理意义的常 量,不应直接使用数字,必须用有意义的枚举或 宏来代替。 是[ ] 否[ ] 免[ ] 5 变量 ¹5-1:去掉没必要的公共变量。 是[ ] 否[ ] 免[ ] ¹5-2:仔细定义并明确公共变量的含义、作用、 取值范围及公共变量间的关系。 ¹5-3:明确公共变量与操作此公共变量的函数或 过程的关系,如访问、修改及创建等。 ¹5-4:当向公共变量传递数据时,要十分小心, 防止赋与不合理的值或越界等现象发生。 ¹5-5:防止局部变量与公共变量同名。 ¹5-6:严禁使用未经初始化的变量作为右值。 6 函数、过程 ¹6-1:对所调用函数的错误返回码要仔细、全面 地处理。 是[ ] 否[ ] 免[ ] ¹6-2:明确函数功能,精确(而不是近似)地实 现函数设计。 是[ ] 否[ ] 免[ ] ¹6-3:编写可重入函数时,应注意局部变量的使 用(如编写C/C++语言的可重入函数时,应使用 auto即缺省态局部变量或寄存器变量)。 是[ ] 否[ ] 免[ ] ¹6-4:编写可重入函数时,若使用全局变量,则 应通过关中断、信号量(即P、V操作)等手段对 其加以保护。 是[ ] 否[ ] 免[ ] 7 可测性 ¹7-1:在同一项目组或产品组内,要有一套统一 的为集成测试与系统联调准备的调测开关及相 应打印函数,并且要有详细的说明。 是[ ] 否[ ] 免[ ]
序 总则条款 执行情况 说明 号 72:在同一项目组或产品组内,调测打印出的是[1否1免1 信息串的格式要有统一的形式。信息串中至少要 有所在模块名(或源文件名)及行号。 7-3:编程的同时要为单元测试选择恰当的测试是]免 点,并仔细构造测试代码、测试用例,同时给出 明确的注释说明。测试代码部分应作为(模块中 的)一个子模块,以方便测试代码在模块中的安 装与拆卸(通过调测开关)。 74:在进行集成测试/系统联调之前,要构造好是[]查】知 测试环境、测试项目及测试用例,同时仔细分析 并优化测试用例,以提高测试效率 7-5:使用断言来发现软件问题,提高代码可测是[否]兔 7-6;用断言来检在程序正常运行时不应发生但是「】都】免 在调测时有可能发生的非法情况。 7-7:不能用断言来检查最终产品肯定会出现目是]免 必须处理的错误情况 17-8:对较复杂的断言加上明确的注释。 是[]否[]免 17-9:用断言确认函数的参数。 是[]否[]免 70用断言保证没有定义的特性或功能不被使是[】】知 17-11:用断言对程序开发环境 否[]免[ (0s/ Compiler/ Hardware)的假设进行检查。 712正式软件产品中应把断言及其它调测代码是否】兔 去掉(即把有关的调测开关关掉) 713:在软件系统中设置与取消有关测试手段,是[]兔门 不能对软件实现的功能等产生影响 7-14:用调测开关来切换软件的B版和正式是]免 版,而不要同时存在正式版本和 DEBUG版本的不 同源文件,以减少维护的难度 715软件的版本和发行版本应该统一雅知门 护,不允许分家,并且要时刻注意保证两个版本 在实现功能上的一致性。 8程序效率 8-1:编程时要经常注意代码的效率 是[]否[]免
序 号 总 则 条 款 执行情况 说明 ¹7-2:在同一项目组或产品组内,调测打印出的 信息串的格式要有统一的形式。信息串中至少要 有所在模块名(或源文件名)及行号。 是[ ] 否[ ] 免[ ] ¹7-3:编程的同时要为单元测试选择恰当的测试 点,并仔细构造测试代码、测试用例,同时给出 明确的注释说明。测试代码部分应作为(模块中 的)一个子模块,以方便测试代码在模块中的安 装与拆卸(通过调测开关)。 是[ ] 否[ ] 免[ ] ¹7-4:在进行集成测试/系统联调之前,要构造好 测试环境、测试项目及测试用例,同时仔细分析 并优化测试用例,以提高测试效率。 是[ ] 否[ ] 免[ ] ¹7-5:使用断言来发现软件问题,提高代码可测 性。 是[ ] 否[ ] 免[ ] ¹7-6:用断言来检查程序正常运行时不应发生但 在调测时有可能发生的非法情况。 是[ ] 否[ ] 免[ ] ¹7-7:不能用断言来检查最终产品肯定会出现且 必须处理的错误情况。 是[ ] 否[ ] 免[ ] ¹7-8:对较复杂的断言加上明确的注释。 是[ ] 否[ ] 免[ ] ¹7-9:用断言确认函数的参数。 是[ ] 否[ ] 免[ ] ¹7-10:用断言保证没有定义的特性或功能不被使 用。 是[ ] 否[ ] 免[ ] ¹7-11:用断言对程序开发环境 (OS/Compiler/Hardware)的假设进行检查。 是[ ] 否[ ] 免[ ] ¹7-12:正式软件产品中应把断言及其它调测代码 去掉(即把有关的调测开关关掉)。 是[ ] 否[ ] 免[ ] ¹7-13:在软件系统中设置与取消有关测试手段, 不能对软件实现的功能等产生影响。 是[ ] 否[ ] 免[ ] ¹7-14:用调测开关来切换软件的DEBUG版和正式 版,而不要同时存在正式版本和DEBUG版本的不 同源文件,以减少维护的难度。 是[ ] 否[ ] 免[ ] ¹7-15:软件的DEBUG版本和发行版本应该统一维 护,不允许分家,并且要时刻注意保证两个版本 在实现功能上的一致性。 是[ ] 否[ ] 免[ ] 8 程序效率 ¹8-1:编程时要经常注意代码的效率。 是[ ] 否[ ] 免[ ]
序 总则条款 执行情况 说明 号 8-2:在保证软件系统的正确性、稳定性、可是否]兔 性及可测性的前提下,提高代码效率。 8-3:局部效率应为全局效率服务,不能因为提是[]否]免 高局部效率而对全局效率造成影响 84:通过对系统数据结构的划分与组织的改进,是[]否门免[1 以及对程序算法的优化来提高空间效率。 8-5:循环体内工作量最小化 是[]否[]免 9质量保证 9-1:在软件设计过程中构筑软件质量 是[]否[]免 9-2:代码质量保证优先原则 9-3:只引用属于自己的存贮空间 9-4:防止引用已经释放的内存空间 是[]否[]兔 9-5:过程/函数中分配的内存,在过程函数退是[]香1知 出之前要释放。 96过程/函数中请的(为打开文件而使用的是[】】知 文件句柄,在过程/函数退出之前要关闭 8:认真处理程序所能遇到的各种出错情况。是[]否1免 9-9:系统运行之初,要初始化有关变量及运行是[]否]免1 环境,防止未经初始化的变量被引用 910:系统运行之初,要对加载到系统中的数据|是[]否1兔门 进行一致性检查。 911:严禁随意更改其它模块或系统的有关设置/是口门否免[ 和配置 19-12:不能随意改变与其它模块的接口。 是[]否[]免 913:充分了解系统的接口之后,再使用系统】出 供的功能 9-14:编程时,要防止差1错误 是[]否[]免 915:要时刻注意易混淆的操作符。当编完程序是 后,应从头至尾检查一遍这些操作符,以防止拼 写错误 9-16:有可能的话,if语句尽量加上else分支, 对没有else分支的语句要小心对待: switchi语句 必须有 default.分支
序 号 总 则 条 款 执行情况 说明 ¹8-2:在保证软件系统的正确性、稳定性、可读 性及可测性的前提下,提高代码效率。 是[ ] 否[ ] 免[ ] ¹8-3:局部效率应为全局效率服务,不能因为提 高局部效率而对全局效率造成影响。 是[ ] 否[ ] 免[ ] ¹8-4:通过对系统数据结构的划分与组织的改进, 以及对程序算法的优化来提高空间效率。 是[ ] 否[ ] 免[ ] ¹8-5:循环体内工作量最小化。 是[ ] 否[ ] 免[ ] 9 质量保证 ¹9-1:在软件设计过程中构筑软件质量。 是[ ] 否[ ] 免[ ] ¹9-2:代码质量保证优先原则 是[ ] 否[ ] 免[ ] ¹9-3:只引用属于自己的存贮空间。 是[ ] 否[ ] 免[ ] ¹9-4:防止引用已经释放的内存空间。 是[ ] 否[ ] 免[ ] ¹9-5:过程/函数中分配的内存,在过程/函数退 出之前要释放。 是[ ] 否[ ] 免[ ] ¹9-6:过程/函数中申请的(为打开文件而使用的) 文件句柄,在过程/函数退出之前要关闭。 是[ ] 否[ ] 免[ ] ¹9-7:防止内存操作越界。 是[ ] 否[ ] 免[ ] ¹9-8:认真处理程序所能遇到的各种出错情况。 是[ ] 否[ ] 免[ ] ¹9-9:系统运行之初,要初始化有关变量及运行 环境,防止未经初始化的变量被引用。 是[ ] 否[ ] 免[ ] ¹9-10:系统运行之初,要对加载到系统中的数据 进行一致性检查。 是[ ] 否[ ] 免[ ] ¹9-11:严禁随意更改其它模块或系统的有关设置 和配置。 是[ ] 否[ ] 免[ ] ¹9-12:不能随意改变与其它模块的接口。 是[ ] 否[ ] 免[ ] ¹9-13:充分了解系统的接口之后,再使用系统提 供的功能。 是[ ] 否[ ] 免[ ] ¹9-14:编程时,要防止差1错误。 是[ ] 否[ ] 免[ ] ¹9-15:要时刻注意易混淆的操作符。当编完程序 后,应从头至尾检查一遍这些操作符,以防止拼 写错误。 是[ ] 否[ ] 免[ ] ¹9-16:有可能的话,if语句尽量加上else分支, 对没有else分支的语句要小心对待;switch语句 必须有default分支。 是[ ] 否[ ] 免[ ]
序 总则条款 执行情况 说明 号 01:打开编译器的所有告警开关对程序进行审 10代码编辑、编译 查 否[]免[ 10-2:在产品软件(项目组)中,要统一编译开 是[]否[]兔[ 关选项。 n10-3:通过代码走读及审查方式对代码进行检是否】兔 104:测试部测试产品之前,应对代码进行抽查是[]香1免 及评审。 11代码测试、维护 11-1:单元测试要求至少达到语句覆盖。 是[]否[]免 112:单元测试开始要跟踪每一条语句,并观察是1门知门 数据流及变量的变化 113:清理、整理或优化后的代码要经过审查[丁门 11-4:代码版本升级要经过严格测试 是[]否了知 11-5:使用工具软件对代码版本进行维护 是[]否[]免 16:正式版本上软件的任何修改都应有详细的是】】知 文档记录。 12宏 □2-1,用宏定义表达式时,要使用完备的括号」口都门兔门 12-2:将宏所定义的多条表达式放在大括号中,是[]否了]兔 12-3:使用宏时,不允许参数发生变化。 是[]否[]兔[
序 号 总 则 条 款 执行情况 说明 10 代码编辑、编译、审查 ¹10-1:打开编译器的所有告警开关对程序进行编 译。 是[ ] 否[ ] 免[ ] ¹10-2:在产品软件(项目组)中,要统一编译开 关选项。 是[ ] 否[ ] 免[ ] ¹10-3:通过代码走读及审查方式对代码进行检 查。 是[ ] 否[ ] 免[ ] ¹10-4:测试部测试产品之前,应对代码进行抽查 及评审。 是[ ] 否[ ] 免[ ] 11 代码测试、维护 ¹11-1:单元测试要求至少达到语句覆盖。 是[ ] 否[ ] 免[ ] ¹11-2:单元测试开始要跟踪每一条语句,并观察 数据流及变量的变化。 是[ ] 否[ ] 免[ ] ¹11-3:清理、整理或优化后的代码要经过审查及 测试。 是[ ] 否[ ] 免[ ] ¹11-4:代码版本升级要经过严格测试。 是[ ] 否[ ] 免[ ] ¹11-5:使用工具软件对代码版本进行维护。 是[ ] 否[ ] 免[ ] ¹11-6:正式版本上软件的任何修改都应有详细的 文档记录。 是[ ] 否[ ] 免[ ] 12 宏 ¹12-1:用宏定义表达式时,要使用完备的括号。 是[ ] 否[ ] 免[ ] ¹12-2:将宏所定义的多条表达式放在大括号中。 是[ ] 否[ ] 免[ ] ¹12-3:使用宏时,不允许参数发生变化。 是[ ] 否[ ] 免[ ]