Linux内核编码规范

学习linux内核或者linux驱动的人应该先掌握内核编码规范,这样才能更好的驾驭linux内核、驱动。

下面就从这几个方面讲解一下linux内核编码规范。

注释风格、排版风格、头文件风格、变量定义、宏定义、函数

1 注释风格

1.1 注释的原则是有助于对程序的阅读和理解,注释不宜太多也不能太少。注释语言必须准确、易懂、简洁,没有歧义性。

1.2 程序文件头部代码应进行注释。注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其他文件的关系、修改日志等。头文件的注释中还应有函数功能简要说明。

/*

* Copyright(C), 2007-2008, Red Hat Inc. // 版权声明

* File name: // 文件名

* Author: // 作者

* Version: // 版本

* Date: // 完成日期

* Description: // 描述本文件的功能,与其他模块的关系

* Function List: // 主要函数的列表,每条记录应包括函数名及功能简要说明

* History: // 修改历史,包括每次修改的日期、修改者和修改内容简述

*/

1.3 函数头部应进行注释,列出函数的功能、输入参数、输出参数、返回值、调用关系等。

/*

* Function: // 函数名称

* Description: // 函数功能、性能等的描述

* Calls: // 被本函数调用的函数清单

* Called By: // 调用本函数的函数清单

* Input: // 输入参数说明,包括每个参数的作用

* Output: // 输出参数说明,有时通过指针参数返回一些变量值

* Return: // 函数返回值的说明

* Others: // 其他说明

*/

1.4 对于所有有特定含义的变量、常量、宏、结构体等数据结构,如果其命名不是充分自注释的,在声明时都必须加上注释,说明其实际含义。变量、常量、宏的注释应放在其上方或右方。

1.5 全局变量要有较详细的注释,包括功能,取值范围,哪些函数访问它,访问时的注意事项。

1.6 为使程序排版整齐,方便阅读和理解,注释也要进行缩进和对齐。

void example_function( void )

{

/* comments one */

unsigned int min_port, max_port;

/* comments two */

if ...

}

1.7 在复杂程序块的结束行右方加注释,以表明某程序块的结束。

示例:

if (...)

{

...

while ( ... )

{

...

} /* while ( ... )循环语句结束*/

...

} /* end of if (...)语句结束 */

2 排版风格

2.1 相对独立的程序块之间、变量声明之后必须加空行。

int conn_fd;

int ret;

conn_fd = socket(AF_INET, SOCK_STREAM,0);

if (conn_fd < 0) {

perror("socket create");

}

2.2 程序块要采用缩进风格编写,缩进为4个空格或一个Tab键。

2.3 对于较长的语句(超过个80字符)要分成多行书写,划分出的新行要进行适当的缩进,使排版整齐,语句可读。对于参数较长的函数也要划分成多行。

ret = connect(conn_fd, (struct sockaddr *)&serv_addr,

sizeof (struct sockaddr));

2.4 一行只写一条语句,不允许把多个短语句写在一行中。

以下语句是不规范的:

min_port = 1; max_port = 65535;

应该如下书写:

min_port = 1;

max_port = 65535;

2.5 if、for、do、while、case、switch、default等语句各自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{ }。

以下语句是不规范的:

if (conn_fd < 0) perror("socket create");

应该如下书写:

if (conn_fd < 0) {

perror("socket create");

}

2.6 ‘{’ 和 ‘}’ 要独占一行

for (i=1; i

{

...

}

或者在代码中‘{’与for语句同行,‘{’前面要有一个空格。

for (i=1; i

...

}

2.7 空格的使用

(1)以下语句在逗号后面加空格。

int min_port, max_port;

(2)"+"、"-"、"*"、"="等算术运算符两边都有一个空格。

a = i + j;

(3)"<"、">="等比较操作符两边都有一个空格。

if (conn_fd < 0) {

(4)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。

i++;

(5)"->"、"."前后不加空格。

portinfo.min_port = i * seg_len + 1;

3 变量定义

3.1 变量命名要清晰明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。

示例:

temp可以简写为tmp

message可以简写为msg

3.2 对于变量命名,禁止使用单个字符(如i、j、k),建议除了要有具体含义外,还能表明其数据类型等,但i、j、k作为局部循环变量是允许的。

int iwidth; // i表明该变量为int型,width指明是宽度

3.3 在Linux下变量命名一般是全小写加下划线的风格。

一般使用:

int min_port;

一般不使用:

int minPort;

3.4 在多线程程序中使用全局变量,应注意对变量操作的原子性。

3.5 应避免局部变量与全局变量同名。

3.6 严禁使用未经初始化的变量作为右值。在C程序中,引用未经赋值的指针,经常会引起程序崩溃。

以下代码在Linux下将导致错误,原因在于:没有使p_string指向某个内存空间的情况下,即对其进行操作是错误的。

char *p_string;

p_sting[0] = ‘a’;

应先进行初始化:

char *p_string;

p_string = (char *)malloc(BUFF_SIZE); // 这里假设BUFF_SIZE已定义

p_sting[0] = ‘a’;

4 宏定义

4.1 代码中尽量少使用字面常量,而使用宏常量

4.2 宏定义时宏名尽量大写

4.3 如果宏名由多个单词组成,那么个单词中间要加_

#define BUFF_SIZE 1024

input_data = (char *)malloc(BUFF_SIZE);

4.4 用宏定义表达式时,要使用完备的括号。

如下定义的宏存在一定的风险:

#define GET_AREA(a,b) a*b

应该定义为:

#define GET_AREA(a,b) ((a)*(b))

4.5 若宏中有多条语句,应该将这些语句放在一对大括号中。

下面语句中只有宏的第一条表达式被执行。

#define INTI_RECT_VALUE( a, b )\

a = 0;\

b = 0;

for (index = 0; index < RECT_TOTAL_NUM; index++)

INTI_RECT_VALUE( rect.a, rect.b );

正确的用法应为:

#define INTI_RECT_VALUE( a, b ) {\

a = 0;\

b = 0;\

}

for (index = 0; index < RECT_TOTAL_NUM; index++) {

INTI_RECT_VALUE( rect[index].a, rect[index].b );

}

5函数定义

5.1 一个函数完成一个特定的功能,不应尝试在一个函数中实现多个不相关的功能。

5.2 检查函数所有输入参数的有效性,比如指针型参数要判断是否为空,数组成员参数判断是否越界。

5.3 一个函数的规模应限制在200行以内(不包括空行和注释行)。

5.4 函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的预期输出。

5.5 函数的参数不宜过多,以1~3个为宜。

5.6 函数名应准确描述函数的功能,一般以动词加宾语的形式命名。

void print_record( struct *p_record, int record_len) ;

5.7 函数的返回值要清楚、明了,让使用者不容易忽视错误情况。函数的每种出错返回值的意义要清晰、明确,防止使用者误用,理解错误或忽视错误返回码。

5.8 如果多段代码重复做同一件事情,那么应该考虑把重复功能实现为一个函数。

5.9 减少函数本身或函数间的递归调用。

递归调用特别是函数间的递归调用(如A->B->C->A),影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试不利。

6头文件风格

6.1 头文件可保存如下内容:宏定义、类型定义、结构体定义、变量声明、函数声明

不要有如下内容:变量定义、函数定义

6.2 头文件必须要有重复包含限制

#ifndef _ALPS_H

#define _ALPS_H

...

#endif

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。

(点击找小助理领取)扫码进群领资料icon-default.png?t=N7T8https://s.pdb2.com/pages/20230519/16QijNiGb32IFIn.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nmap端口扫描工具安装和使用方法

nmap&#xff08;Network Mapper&#xff09;是一款开源免费的针对大型网络的端口扫描工具&#xff0c;nmap可以检测目标主机是否在线、主机端口开放情况、检测主机运行的服务类型及版本信息、检测操作系统与设备类型等信息。本文主要介绍nmap工具安装和基本使用方法。 nmap主…

jar混淆,防止反编译,Allatori工具混淆jar包

文章目录 Allatori工具简介下载解压配置config.xml注意事项 Allatori工具简介 官网地址&#xff1a;https://allatori.com/ Allatori不仅混淆了代码&#xff0c;还最大限度地减小了应用程序的大小&#xff0c;提高了速度&#xff0c;同时除了你和你的团队之外&#xff0c;任何人…

java的XWPFDocument3.17版本学习

maven依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version> </dependency> 测试类&#xff1a; import org.apache.poi.openxml4j.exceptions.InvalidFormatExcep…

【第七在线】数据分析与人工智能在商品计划中的应用

随着技术的不断进步&#xff0c;数据分析和人工智能&#xff08;AI&#xff09;已经成为了现代商品计划的关键组成部分。在服装行业&#xff0c;这两项技术正在帮助企业更好地理解市场需求、优化库存管理、提高生产效率和提供更好的客户体验。本文将深入探讨数据分析和人工智能…

华为鸿蒙开发适合哪些人学习?

随着鸿蒙系统的崛起&#xff0c;越来越多的人开始关注鸿蒙开发&#xff0c;并希望成为鸿蒙开发者。然而&#xff0c;鸿蒙开发并不适合所有人&#xff0c;那么哪些人最适合学习鸿蒙开发呢&#xff1f;本文将为您总结鸿蒙开发适合的人群。 一、具备编程基础的人 学习鸿蒙开发需要…

C语言——最古老的树

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 缺乏明确的目标&#xff0c;一生将庸庸…

性能优化之资源优化

性能优化之资源优化 资源优化性能关键检测流程。浅析一下基于Unity3D 美术规则约束一、模型层面二、贴图层面三、动画层面四、声音层面&#xff1a;&#xff08;音频通用设置&#xff09;五、UI层面&#xff1a; 题外点&#xff1a;诚然在优化中&#xff0c;美术占比是很重要的…

CDN缓存技术对网站的作用有什么

CDN缓存是什么&#xff1f; CDN缓存&#xff0c;即内容分发网络缓存&#xff0c;是一种用于提高网络内容传输效率和稳定性的技术。CDN缓存可以在网络中存储大量的数据和文件&#xff0c;例如网页、图片、视频等&#xff0c;从而避免用户直接从原始服务器获取数据&#xff0c;减…

sql-labs服务器结构

双层服务器结构 一个是tomcat的jsp服务器&#xff0c;一个是apache的php服务器&#xff0c;提供服务的是php服务器&#xff0c;只是tomcat向php服务器请求数据&#xff0c;php服务器返回数据给tomcat。 此处的29-32关都是这个结构&#xff0c;不是用docker拉取的镜像要搭建一下…

如何使用kali来进行一次ddos攻击

本文章用于记录自己的学习路线&#xff0c;不用于其他任何途径! ! ! 哈喽啊&#xff01;又是好久不见&#xff0c;本博主在之前发过一个ddos攻击的介绍。 emm…虽然那篇文章也提到了ddos攻击的方式&#xff0c;但太过于简陋&#xff0c;好像也没有什么用&#xff0c;so&#…

redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.编辑3个redis配置 cd /etc mkdir redis-ms cd redis-ms/ vim redis6379.conf vim redis6380.conf vim redis6381.conf# master #端口号 port 6379#设置客户端连接后进行任何其他指定前需要使用的密码 requirepass 12345…

力扣单调栈算法专题训练

目录 1 专题说明2 训练 1 专题说明 本博客用来计算力扣上的单调栈题目、解题思路和代码。 2 训练 题目1&#xff1a;2866美丽塔II。 解题思路&#xff1a;先计算出prefix[i]&#xff0c;表示0~i满足递增情况下&#xff0c;0~i上的元素之和最大值。然后计算出suffix[i]&#…

【数据结构】队列的使用|模拟实现|循环队列|双端队列|面试题

一、 队列(Queue) 1.1 概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0&#xff08;Application …

Linux数据库主从复制(单主单从)

MySQL主从复制的优点包括&#xff1a; 1、横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中&#xff0c;所有写入和更新都必须在主服务器上进行。但是&#xff0c;读取可以在一个或多个从设备上进行。该模型可以提高写入性能&#xff08;因为主设备专用于更新…

css 三角形实现方式及快速联想记忆

css实现三角形是常见的需求&#xff0c;在此记录如下 1 边框实现 原理&#xff1a;相邻的border之间会形成一条斜线(可按此联想记忆) .triangle {width: 0;height: 0;border-left: 100px solid red;border-right: 100px solid green;border-top: 100px solid blue;border-bot…

redis 从0到1完整学习 (六):Hash 表数据结构

文章目录 1. 引言2. redis 源码下载3. dict 数据结构4. 哈希表扩容与 rehash5. 参考 1. 引言 前情提要&#xff1a; 《redis 从0到1完整学习 &#xff08;一&#xff09;&#xff1a;安装&初识 redis》 《redis 从0到1完整学习 &#xff08;二&#xff09;&#xff1a;red…

循环渲染ForEach

目录 1、接口说明 2、键值生成规则 3、组件创建规则 3.1、首次渲染 3.2、非首次渲染 4、使用场景 4.1、数据源不变 4.2、数据源组项发生变化 4.3、数据源数组项子属性变化 5、反例 5.1、渲染结果非预期 5.2、渲染性能降低 Android开发中我们有ListView组件、GridVi…

大创项目推荐 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

【Element】el-table 使用 el-table-infinite-scroll 插件实现滚动加载

虽然 el 官方提供了 Infinite Scroll 无限滚动 组件 但是却不支持 el-table 组件&#xff0c;这就很难受了&#xff0c;还好已经有大佬写好了插件&#xff0c;并且支持 element-plus/infinite-scroll 组件的所有选项。 el-table-infinite-scroll el-table-infinite-scroll 看…