当前位置: 首页 > backend >正文

56、【OS】【Nuttx】编码规范解读(四)

背景

接之前 blog
53、【OS】【Nuttx】编码规范解读(一)
54、【OS】【Nuttx】编码规范解读(二)
55、【OS】【Nuttx】编码规范解读(三)
分析了行宽格式,注释要求,花括号风格等,下面继续来分析

Nuttx 编码规范

花括号缩进例外

在这里插入图片描述

涉及到结构体(structure)、枚举(enumeration)、联合体(union)时,花括号不需要额外的缩进(对于 GNU 风格而言),举例如下:
在这里插入图片描述
在这里插入图片描述

缩进

在这里插入图片描述

Nuttx 项目中缩进的使用和 GNU 编码规范 类似,但也有点细小的差别

  • 缩进的基本单位是2个空格
  • 每一级的缩进都比前一级多出两个空格
  • 不要使用TAB字符进行缩进,避免不同编辑器对 TAB 宽度解释不一致(如果使用,记得把编辑器的缩进调成 两个空格)

举例如下:
在这里插入图片描述

Tab 使用说明

在这里插入图片描述
虽然源文件和头文件禁止使用 TAB 进行缩进,但在如Makefile、汇编语言源文件、Kconfig文件和一些脚本文件中,允许使用 TAB 进行缩进,TAB 设置为 4 个空格

花括号对齐

在这里插入图片描述
花括号必须单独占一行,每级需要缩进两个空格,而且花括号本身也要缩进两个空格(GNU风格),这里就有个有趣的现象:

  • 所有C语句所在列为 4*n + 2(比如 2, 6, 10…)
  • 左右花括号所在列为 4*n(比如 4, 8, 12…)
  • 上述特性意味着在同一缩进级别,代码行和对应的左右花括号在不同的固定列上对齐

预处理指令的缩进

在这里插入图片描述

  • 预处理器指令的关键字(#)从第 1 列开始
  • 预处理器指令也要遵循一般的缩进规则(即每级缩进2个空格),从关键字(#)后面的内容开始遵循这个缩进原则

举例如下
在这里插入图片描述
例外:每个头文件在开头包含了幂等性定义,这种条件编译不会引起任何缩进的变化,举例如下
在这里插入图片描述

圆括号

在这里插入图片描述
圆括号需遵循以下规则:

  • 关键字后留空格:使用C语言关键字(如 if, for, switch, while, do, return 等)时,不要将左括号(直接跟在关键字后面,关键字和左括号之间要有一个空格
  • 函数名与参数列表之间不要有空格
  • 右括号前不要加空格
  • 返回值不要加括号,除非是为了强制运算顺序

示例如下:
在这里插入图片描述
Nuttx 对圆括号的态度:
在这里插入图片描述

  • 有些开发人员对运算符优先级不太有把握,因此喜欢在表达式中大量圆括号来明确指定运算顺序,而这些括号实际上不会影响运算顺序
  • 虽然这样可以防止误解运算符优先级,但也让代码看起来很丑

基于以上考虑,Nuttx 不推荐为了强制运算顺序而使用不必要的括号,但也没有特定要求必须或禁止使用括号,而是建议开发人员实事求是,视具体情况来决定是否使用括号

数据和类型定义

定义和声明独占一行

示例如下
在这里插入图片描述

全局变量

在这里插入图片描述

  • 全局变量是在函数外定义的变量,作用域可以跨越多个文件或仅限于单个文件
  • 全局符号前如果加上 static 关键字,则该变量的作用域仅限于定义它的文件,也就是私有全局符号
  • 没有 static 修饰符的全局变量可以在不同的文件间共享,这类符号被称为公共全局变量

编码规范:

  • 名字要简短,避免过于冗长的变量名,比如 g_filelen 就比 g_lengthoffile 要好
  • 全局变量名要以前缀 g_ 开头,以指示其为全局变量
  • 如果全局变量属于某个特定模块,要在前缀中包含该模块名,比如 xyz 模块的全局变量格式为g_xyz
  • 全局变量名全部使用小写字母(不用驼峰写法)
  • 尽量避免在变量名中使用下划线作为分隔符,以减少下划线的使用
  • 对于较长的变量名可能需要下划线分割来提高可读性,但总体上变量名还是要简短
  • 尽量把全局变量封装在结构体内,以减少命名冲突
  • 限制全局变量的使用,能用私有的就用私有,对外暴露用接口形式,面向接口编程

举例如下:
在这里插入图片描述

http://www.xdnf.cn/news/3968.html

相关文章:

  • NV214NV217美光闪存固态NV218NV225
  • Jasper and Stella: distillation of SOTA embedding models
  • P1802 5 倍经验日
  • 【AI提示词】 复利效应教育专家
  • Python实例题:Python获取NBA数据
  • 大连理工大学选修课——图形学:第三四章 基本图形生成算法
  • 低速总线:IIC和SMBUS
  • JAVA---继承
  • avx指令实现FFT
  • 【Linux系统】互斥量mutex
  • 当SONiC遇到CPO,SONiC对共封装光接口的管理
  • 在两个bean之间进行数据传递的解决方案
  • langchain中 callbacks constructor实现
  • 如何使用python保存字典
  • **马小帅面试记:Java技术问答**
  • 邮件协议、签名与推送
  • Learning vtkjs之MultiSliceImageMapper
  • 【C++】Docker常用语法
  • VTK入门指南
  • Leetcode 3538. Merge Operations for Minimum Travel Time
  • Spring AI版本1.0.0-M6和M8效果比较
  • Shell-流程控制-判断
  • 过采样处理
  • educoder平台课-Python程序设计-6.序列类型
  • 【翻译、转载】【转载】LLM 的函数调用与 MCP
  • Linux 的网络卡
  • ST-LINKV2仿真器下载
  • Java基于SaaS模式多租户ERP系统源码
  • 四年级数学知识边界总结思考-上册
  • GCC 使用指南