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

57、【OS】【Nuttx】编码规范解读(五)

背景

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

Nuttx 编码规范

函数参数和局部变量

在这里插入图片描述

  • 函数参数和局部变量命名规则相同
  • 命名要简洁,避免过于冗长的名字,比如 len 优于 lengthofiobuffer
  • 避免单字符变量名,除了 i,j,k 这些用于循环索引
  • 局部变量不需要特殊的前缀,但可以使用前缀 p 或 pp 来表示指针或指向指针的变量
  • 变量名全部小写,减少下划线的使用

举例如下
在这里插入图片描述
这里 & lt; 是 HTML 或 XML 中用于表示小于号(<)的实体引用,网站显示有点问题,主要就是 for (i = 0; i < limit; i++)

类型定义

在这里插入图片描述

  • 命名简短
  • 所有 typedef 定义的类型名以 _t 结尾,表示这是一个通过 typedef 定义的类型,如 fhandle_t、point_t 等
  • 模块名称前缀,全部小写字母,减少使用下划线这些都是前面讲过的

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

结构体

结构体命名

在这里插入图片描述
1、 所有结构体必须命名,即使它们是类型定义的一部分,关键字 struct 后面必须跟随一个结构体名称,比如下面的写法在 Nuttx 里是不推荐的

struct {uint8_t a;uint8_t b;
} ab = { 0U, 0U};

但也有两个例外:

  • 如果结构体在另一个联合体(union)或结构体内定义的(不推荐),可以省略结构体名称
  • 如果结构体是局部变量类型,也可以省略结构体名称

2、 避免嵌套定义结构体,可以在包含结构体内部定义其他结构体,但不推荐,除非必要
3、 结构体字段必须命名,结构体内的字段如果是另一个结构体类型,则该字段必须有名称。C11 允许无名结构体字段,但 Nuttx 遵循 C89 标准,不允许无名结构体字段

在C11标准中,确实引入了匿名结构体和联合体的支持,这种特性可以使代码更加简洁,并且可以直接访问内部结构体成员,就像它们是外部结构体的直接成员一样
举例如下

struct Person {char firstName[50];char lastName[50];// 匿名结构体字段struct {char street[50];char city[50];char state[20];};  // 匿名结构体,没有名称int age;
};int main() {struct Person person;// 直接初始化匿名结构体的字段snprintf(person.street, sizeof(person.street), "123 Elm St");snprintf(person.city, sizeof(person.city), "Springfield");snprintf(person.state, sizeof(person.state), "IL");...return 0;
}
  • 这个例子中,struct Person 中包含了一个匿名结构体,用于存储地址信息(如街道、城市,省份等等)。由于它是匿名的,其成员(如 street, city, state)可以直接作为 struct Person 的一部分被访问
  • 开发人员可以直接通过 person.street, person.city 和 person.state 访问这些匿名结构体中的成员,而不需要通过一个中间的名字来引用

虽然 C11 允许,但 Nuttx 不推荐这样做,要避免使用匿名结构体,有如下原因:

  • 可移植性:不是所有的编译器都完全支持 C11 的所有特性,比如一些旧版本或特定平台上的编译器
  • 代码清晰度:虽然匿名结构体可以使代码看起来更简洁,但也可能不利于代码的可读性和可维护性,特别是对于不熟悉这种语法的人

先分析到这儿,下次再接着分析

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

相关文章:

  • ET CircularBuffer 类
  • Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
  • 动态贴纸的实时渲染原理:美颜SDK中的特效引擎开发实录
  • 化工厂电动机保护升级记:当Profinet遇上DeviceNet
  • 【数字图像处理】_笔记
  • Webpack 5 模块联邦(Module Federation)详解与实战
  • 多头注意力 vs 单头注意力:计算量与参数量区别
  • MySQL日志文件有哪些?
  • 一、docker安装以及配置加速
  • [免费]SpringBoot+Vue在线教育(在线学习)系统(高级版)【论文+源码+SQL脚本】
  • Python打卡训练营Day37
  • 《仿盒马》app开发技术分享-- 新增地址(端云一体)
  • AI算力网络光模块市场发展分析
  • 第二章 1.1 数据采集安全风险概述
  • 程序编码规范,软件设计规范
  • 【产品经理】产品经理知识体系
  • Mysql性能优化方案
  • 洛谷题目:P2785 物理1(phsic1)- 磁通量 题解 (本题较难)
  • Arduino+LCD1602,并口版 LCD1602和IIC版LCD1602
  • w~自动驾驶~合集2~激光毫米波雷达
  • 深入解构 Chromium 升级流程与常见问题解决方案
  • 从实验室到工业的“加速器”:单原子催化技术的突破与应用
  • 兰亭妙微 | 图标设计公司 | UI设计案例复盘
  • 机器学习中的 K-均值聚类算法及其优缺点
  • 快速上手SHELL脚本基础及变量与运算
  • 一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释
  • UE C++学习笔记之按键绑定
  • 使用Dockerfile创建镜像
  • AI时代新词-人工智能生成内容(AIGC)
  • 不用框架也能做出 Apple 风的网页动画!