Linux内核编码规范

news2025/1/24 8:35:04
学习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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-内网,离线使用百度地图(地图瓦片图下载静态资源展示定位)

前言 最近发现很多小伙伴都在问内网怎么使用百度地图&#xff0c;或者是断网情况下能使用百度地图吗 后面经过一番研究&#xff0c;主要难点是&#xff0c;正常情况下我们是访问公网百度图片&#xff0c;数据&#xff0c;才能使用 内网时访问不了百度地图资源时就会使用不了&…

CVE-2023-49898 Apache incubator-streampark 远程命令执行漏洞

项目介绍 Apache Flink 和 Apache Spark 被广泛用作下一代大数据流计算引擎。基于大量优秀经验结合最佳实践&#xff0c;我们将任务部署和运行时参数提取到配置文件中。这样&#xff0c;带有开箱即用连接器的易于使用的 RuntimeContext 将带来更轻松、更高效的任务开发体验。它…

RIPV1配置实验

查看路由器路由表&#xff1a; 删除手工配置的静态路由项&#xff1a; Route1->Config->static Remove删除路由项 删除Route3的路由项&#xff0c;方法同上删除Route2的路由项&#xff0c;方法同上 完成路由器RIP配置&#xff1a; Route1->Config->RIP->Ne…

C语言之字符串

目录 字符串字面量 ​编辑 字符串字面量的长度 ◆具有静态生命周期 ◆对于同一个字符串字面量的处理方式依赖于编译器 字符串 字符数组的初始化赋值 空字符串 字符串的读取 在前面的学习中就会发现&#xff0c;仅仅能用一个字符表示的事物少之又少&#xff0c;对于地…

基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else

一、策略模式 1.1策略模式定义 在策略模式&#xff08;Strategy Pattern&#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相…

python画图【03】泰坦尼克号数据分析

导包 import numpy as np import pandas as pdimport matplotlib import matplotlib.pyplot as plt %matplotlib inlineplt.rcParams[font.sans-serif] "Microsoft YaHei"import seaborn as sns加载数据集 titanic sns.load_dataset("titanic")titanic…

pip 常用指令 pip cache 命令用法介绍

&#x1f4d1;pip 常用命令归类整理 pip cache 是一个用于管理pip缓存的命令。pip是Python的包管理器&#xff0c;用于安装和管理Python包。当你使用pip安装一个包时&#xff0c;pip会首先在其缓存中查找该包。如果在缓存中找到&#xff0c;pip将从缓存中安装该包&#xff0c;…

HarmonyOS布局之scroll

对于Scroll 布局官方讲解非常好&#xff0c;我在这做个总结&#xff0c;主要结合实际应用进行补充 Scroll — 首先他是一个容器布局&#xff0c;所有的容器布局都可包含子布局&#xff0c;因此scroll 布局也可包含子组件但是&#xff08;他只能包含一个子组件&#xff09;&…

wordpress主题modown v8.81+erphpdown v16.0无限制无授权开心版

修复bug&#xff08;v8.81 2023.03.07&#xff09; 新增文章页正文下面常见问题手风琴模块&#xff0c;可设置显示文章的更新日期而不是发布日期&#xff0c;首页幻灯片支持指定文章、支持一个大图4个小图显示&#xff0c;grid网格列表支持显示简介&#xff0c;前台个人中心里显…

Odoo16 实用功能之在Tree视图的记录中加入按钮

Tree视图中添加按钮&#xff0c;通常使用<button>标签 只能有一列来显示这些按钮 代码示例&#xff1a; <tree><field name"name" /><button name"test001" class"text-warning" type"object" string"Resc…

NHANES数据库周报(12.6)

郑老师统计课程&#xff0c;欢迎点击报名&#xff1a;Nhanes公共数据库挖掘 课程 美国国家健康和营养检查调查&#xff08;NHANES&#xff09;是一项旨在评估美国成人和儿童健康和营养状况的研究计划。该调查的独特之处在于它结合了访谈和体格检查。由美国疾病控制和预防中心&a…

Java日志框架Logback

logback.xml文件配置(放在src下微服务建议放在resources下) <?xml version"1.0" encoding"UTF-8"?> <configuration><!--定义日志文件的存储地址,使用绝对路径--><property name"LOG_HOME" value"d:/logs"/>…

【Linux笔记】系统信息

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 1. uname - 显示系统信息 2. hostname - 显示或设置系统主机名 3. top - 显示系统资源使用情况 4. df - 显示磁盘空间使用情…

eclipse中基于maven构建的web项目pom.xml中指定的jar包无法发布到tomcat中

eclipse运行maven web项目报错&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 信息: Star…

EDA实验-----直流电机驱动设计(Quartus II )

目录 一、实验目的 二、实验仪器设备 三、实验的重点和难点 四、实验原理 五、实验步骤 六、实验报告 七、实验过程 1.分频器代码 2.方向选择器 3.直流电动机工作原理 4.电路连接图 5.文件烧录 一、实验目的 了解直流电机控制的工作原理和实现的方法。掌握PWM波控…

农学小作业(根据降雨量计算排灌水量)(旱地版)

//------------------------------------------------------------------------------------------------------------------- //农学小作业(根据降雨量计算排灌水量)(旱地版) //01.参考书目:ISBN-7-80734-087-8.ISBN-7-80124-644-6. //01.农作物生长发育阶段需要消耗水份. //0…

Deepin更换仿Mac主题

上一篇博客说了要写一篇deepin系统的美化教程 先看效果图&#xff1a; 准备工作&#xff1a; 1.你自己 嘻嘻嘻 2.能上网的deepin15.11电脑 首先去下载主题 本次需要系统美化3部分&#xff1a;1.图标 2.光标 3.壁纸 开始之前&#xff0c;请先把你的窗口特效打开&#xff0c;…

【MVT_1703230471】基于Python NLTK分词、词云、LDA主题分类及GPT情感分类

【Talk is cheap】 1 数据探索 case idcase outcome case title case text 0 Case1 cited Alpine Hardwood (Aust) Pty Ltd v Hardys Pty Lt... Ordinarily that discretion will be exercised s... 1 Case2 cited Black v Lipovac [1998] FCA 699 ; (1998) 217 AL... The gen…

Epson爱普生手臂机器人与PC通讯 C#

一、Epson手臂配置 1.安装Epson手臂控制软件 安装Epson手臂控制软体EPSON RC+ 7.0(根据实际需求下载应用),可以去官网下载安装。 2.硬件配置 准备一台PC,用网线连接PC和EPSON手臂控制器。 3.在PC上修改IP地址 EPSON手臂默认IP(192.168.0.1),PC IP改为手臂同一网段…

歌曲春节回家:荆涛歌声中的深情与诗人的心声

歌曲春节回家&#xff1a;荆涛歌声中的深情与诗人的心声 在寒冬的寂静中&#xff0c;荆涛的歌声如同春风拂面&#xff0c;温暖而深情。它唤起了我们对家的思念&#xff0c;让我们感受到家的温暖和亲情的珍贵。而在歌声中&#xff0c;我们仿佛听到了那些描绘春节的经典诗句&…