原则8.2 不用或者少用全局变量。
说明:单个文件内部可以使用static的全局变量,可以将其理解为类的私有成员变量。全局变量应该是模块的私有数据,不能作用对外的接口使用,使用static类型定义,可以有效防止外部文件的非正常访问,建议定义一个STATIC宏,在调试阶段,将STATIC定义为static,版本发布时,改为空,以便于后续的打补丁等操作。
直接使用其他模块的私有数据,将使模块间的关系逐渐走向“剪不断理还乱”的耦合状态,这种情形是不允许的。 原则 8.3防止局部变量与全局变量同名。
说明:尽管局部变量和全局变量的作用域不同而不会发生语法错误,但容易使人误解。
原则 8.4通讯过程中使用的结构,必须注意字节序。
说明:通讯报文中,字节序是一个重要的问题,我司设备使用的cpu类型复杂多样,大小端、32位/64位的处理器也都有,如果结构会在报文交互过程中使用,必须考虑字节序问题。由于位域在不同字节序下,表现看起来差别更大,所以更需要注意。对于这种跨平台的交互,数据成员发送前,都应该进行主机序到网络序的转换;接收时,也必须进行网络序到主机序的转换。
原则 8.5严禁使用未经初始化的变量作为右值。
说明:坚持原则8.6(在首次使用前初始化变量,初始化的地方离使用的地方越近越好。)可以有效避免未初始化错误。 原则 8.6在首次使用前初始化变量,初始化的地方离使用的地方越近越好。
说明:未初始化变量是C和C++程序中错误的常见来源。在变量首次使用前确保正确初始化。在较好的方案中,变量的定义和初始化要做到亲密无间。 示例:
原则 8.7明确全局变量的初始化顺序,避免跨模块的初始化依赖。 说明:系统启动阶段,使用全局变量前,要考虑到该全局变量在什么时候初始化,使用全局变量和初始化全局变量,两者之间的时序关系,
11 / 19
谁先谁后,一定要分析清楚,不然后果往往是低级而又灾难性的。 原则 8.8尽量减少没有必要的数据类型默认转换与强制转换。 说明:当进行数据类型强制转换时,其数据的意义、转换后的取值等都有可能发生变化,而这些细节若考虑不周,就很有可能留下隐患。 示例:如下赋值,多数编译器不产生告警,但值的含义还是稍有变化。
9 注释
原则9.1 优秀的代码可以自我解释,不通过注释即可轻易读懂。 说明:优秀的代码不写注释也可轻易读懂,注释无法把糟糕的代码变好,需要很多注释来解释的代码往往存在坏味道,需要重构。 示例:注释不能消除代码的坏味道:
重构代码后不需要注释
12 / 19
原则9.2 注释的内容要清楚、明了,含义准确,防止注释二义性。 说明:有歧义的注释反而会导致维护者更难看懂代码,正如带两块表反而不知道准确时间。
示例:注释与代码相矛盾,注释内容也不清楚,前后矛盾。
正确做法:修改注释描述如下:
原则9.3在代码的功能、意图层次上进行注释,即注释解释代码难以直接表达的意图,而不是重复描述代码。
说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。 对于实现代码中巧妙的、晦涩的、有趣的、重要的地方加以注释。 注释不是为了名词解释(what),而是说明用途(why)。 示例:如下注释纯属多余。
原则则9.4 修改代码时,维护代码周边的所有注释,以保证注释与代码的一致性。不再有用的注释要删除。
说明:不要将无用的代码留在注释中,随时可以从源代码配置库中找回代码;即使只是想暂时排除代码,也要留个标注,不然可能会忘记处理它。
原则9.5 函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等。
说明:重要的、复杂的函数,提供外部使用的接口函数应编写详细的注释。
原则9.6 全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。 示例:
13 / 19
原则9.7 注释应放在其代码上方相邻位置或右方,不可放在下面。如放于上方则需与其上面的代码用空行隔开,且与下方代码缩进相同。 示例
原则9.8同一产品或项目组统一注释风格。
10 排版与格式
规则10.1程序块采用缩进风格编写,每级缩进为4个空格。
说明:当前各种编辑器/IDE都支持TAB键自动转空格输入,需要打开相关功能并设置相关功能。 编辑器/IDE如果有显示TAB的功能也应该打开,方便及时纠正输入错误。 IDE向导生成的代码可以不用修改。 宏定义、编译开关、条件预处理语句可以顶格。
规则10.2相对独立的程序块之间、变量说明之后必须加空行。 示例:如下例子不符合规范。
应如下书写
14 / 19
规则10.3一条语句不能过长,如不能拆分需要分行写。一行到底多少字符换行比较合适,产品可以自行确定。
说明:对于目前大多数的PC来说,132比较合适(80/132是VTY常见的行宽值);对于新PC宽屏显示器较多的产品来说,可以设置更大的值。换行时有如下建议:
(1)换行时要增加一级缩进,使代码可读性更好;
(2)低优先级操作符处划分新行;换行时操作符应该也放下来,放在新行首;
(3)换行时建议一个完整的语句放在一行,不要根据字符数断行。 示例:
规则10.4在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。
说明:采用这种松散方式编写代码的目的是使代码更加清晰。 在已经非常清晰的语句中没有必要再留空格,如括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空 格时不要连续留两个以上空格。 示例:
1)逗号、分号只在后面加空格
2)比较操作符, 赋值操作符\、 \,算术操作符\、\,逻辑操作符\、\,位域操作符\、\等双目操作符的前后加空格。
15 / 19