编码规
1.
头文件编码规
  1. 禁止头文件循环依赖。
  2. .c/.件不要包含用不到的头文件。
  3. 禁止在头文件中定义变量。 
  4. 同一产品统一包含头文件排列方式。(如功能块排序、文件名升序、稳定度排序。)
  5. 只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c过extern的方式使用外部函数接口、变量。
2. 函数编写规
  1. 一个函数仅完成一件功能。
c语言基本名词概念
  2. 重复代码应该尽可能提炼成函数。
  3.为简单功能编写函数
  4.函数的返回值要清楚、明了,让使用者不容易忽视错误情况。
  5. 避免函数过长,新增函数不超过100行(非空非注释行)。
  6. 避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。
  7. 可重入函数应避免使用全局变量和禁止使用static变量。
  8. 设计高扇入,合理扇出(小于7)的函数。
  9. 废弃代码(没有被调用的函数和变量)要及时注释(有助于更好理解程序)。
  10. 对所调用函数的错误返回码要仔细、全面地处理。
  11. 函数不变参数使用const。
  12. 函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。
  13. 函数的参数个数不超过5个。
  14. 减少或禁止函数本身或函数间的递归调用 
3. 标识符命名与定义
3.1通用命名规则 
  1. 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
  2. 除了常见的通用缩写以外,不使用单词缩写,不得使用汉语拼音。
    示例:
  argument 可缩写为 arg      buffer 可缩写为 buff        clock 可缩写为 clk
  command 可缩写为 cmd      compare 可缩写为 cmp      configuration 可缩写为 cfg
  device 可缩写为 dev        error 可缩写为 err          hexadecimal 可缩写为 hex
  increment 可缩写为 inc      initialize 可缩写为 init      maximum 可缩写为 max
  message 可缩写为 msg      minimum 可缩写为 min      parameter 可缩写为 para
  previous 可缩写为 prev      register 可缩写为 reg        semaphore 可缩写为 sem
  statistic 可缩写为 stat        synchronize 可缩写为 sync    temp 可缩写为 tmp
  3. 产品/项目组部应保持统一的命名风格。 (Unix like和windows like风格)
  4. 自己特有的命名风格,要自始至终保持一致,不可来回变化。
  5. 命名中若使用特殊约定或缩写,则要有注释说明。
  6. 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
    示例:
add/remove                      begin/end                        create/destroy
  insert/delete                  first/last                      get/release
  increment/decrement            put/get                          add/delete
  lock/unlock                    open/close                      min/max
  old/new                        start/stop                      next/previous
  source/target                  show/hide                        send/receive
  source/destination              copy/paste                      up/down
  7. 尽量避免名字中出现数字编号,除非逻辑上的确需要编号。
  8. 平台/驱动等适配代码的标识符命名风格保持和平台/驱动一致。
  9. 重构/修改部分代码时,应保持和原有代码的命名风格一致。
3.2 变量命名规则 
  1. 全局变量应增加“g_”前缀。
  2. 静态变量应增加“s_”前缀。
  3. 禁止使用单字节命名变量,但允许定义i、j、k作为局部循环变量。
  4. 使用名词或者形容词+名词方式命名变量。
3.3函数命名规则
1. 函数命名应以函数要执行的动作命名,一般采用动词或者动词+名词的结构
2.函数指针除了前缀,其他按照函数的命名规则命名。
3.4 宏的命名规则
  1. 对于数值或者字符串等等常量的定义,建议采用全大写字母,单词之间加下划线‘_’的方式命名(枚举同样建议使用此方式定义)。
    示例:
      #define PI_ROUNDED 3.14
  2. 除了头文件或编译开关等特殊标识定义,宏定义不能使用下划线‘_’开头和结尾。
4. 变量
  1. 一个变量只有一个功能,不能把一个变量用作多种用途。
  2. 结构功能单一,不要设计面面俱到的数据结构。
  3. 不用或者少用全局变量。
  4. 防止局部变量与全局变量同名。
  5. 严禁使用未经初始化的变量作为右值。
6. 构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的全局变量,防止多个不同模块或函数都可以修改、创建同一全局变量的现象。
  7. 在首次使用前初始化变量,初始化的地方离使用的地方越近越好。
  8. 明确全局变量的初始化顺序,避免跨模块的初始化依赖。
  9. 尽量减少没有必要的数据类型默认转换与强制转换。
5. 宏、常量
  1. 除非必要,应尽可能使用函数代替宏。
  2. 常量建议使用const定义代替宏。
6. 质量保证
  1. 代码质量保证优先原则
(1)正确性,指程序要实现设计要求的功能。
(2)可靠性,指程序在给定时间间隔和环境条件下,按设计要求成功运行程序的概率。    (3)代码可测试性,指软件发现故障并隔离、定位故障的能力,以及在一定的时间和成本前提下,进行测试设计、测试执行的能力。
(4)简洁性,指程序易于理解并且易于实现。
(5)可维护性,指程序被修改的能力,包括纠错、改进、新需求或功能规格变化的适应能力。
(6)可移植性,指为了在原来设计的特定环境之外运行,对系统进行修改的能力。
(7)代码性能高效,指是尽可能少地占用系统资源,包括存和执行时间。
(8)个人表达方式/个人方便性,指个人编程习惯。
  2. 要时刻注意易混淆的操作符。
    示例
    赋值操作符“=”      逻辑操作符“==”
      关系操作符“<”      位操作符"<<"
      关系操作符“>”      位操作符“>>”
      逻辑操作符“||”    位操作符"|"
      逻辑操作符“&&”    位操作符"&"
  逻辑操作符"!"      位操作符“~”
3. 易用错的操作符
(1)除操作符"/"
          当除操作符“/”的运算量是整型量时,运算结果也是整型。
(2)求余操作符"%"
求余操作符"%"的运算量只能是整型。
    (3)自加、自减操作符“++”、“--” 
  4. 了解编译系统的存分配方式,特别是编译系统对不同类型的变量的存分配规则。
  5. 禁止存操作越界。
采用下列措施:
(1)数组的大小要考虑最大情况,避免数组分配空间不够。     
        (3)使用memcpy/memset时一定要确保长度不要越界。
        (4)字符串考虑最后的’\0’, 确保所有字符串是以’\0’结束 。
        (5)指针加减操作时,考虑指针类型长度 。
        (6)数组下标进行检查 。
    (7)使用时sizeof或者strlen计算结构/字符串长度,避免手工计算。
  6. 系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
  7. 编程时,要防止差1错误。(“++”“——”“>=””<=”)
  9. 所有的if ... else if结构应该由else子句结束 ;switch语句必须有default分支。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。