C语言中的typedef简介

type简介

在C语言中,typedef 是用于为现有的数据类型定义一个新的类型名称的关键字。它的作用是为类型取一个别名,使代码更简洁、更易于理解。

基本语法

typedef 原始类型 新类型名; 

示例

  1. int 类型定义一个别名:

    typedef int INTEGER; 
    INTEGER a = 10; // 这里的 a 实际上是 int 类型的变量 
  2. 为结构体定义别名:

    struct Point {int x;int y;
    };typedef struct Point POINT;POINT p1;  // 现在可以直接用 POINT 来声明结构体变量

typedef 的用途

  • 简化复杂类型定义:当类型非常复杂时,可以用 typedef 提供简洁的别名。
  • 提高代码可读性:通过为数据类型起一个具备语义的名字,代码可读性更高。
  • 便于移植:通过使用 typedef,可以在需要修改类型时只修改一处代码。

总结来说,typedef 提供了一种方法来使代码更加清晰、简洁,同时也方便类型的管理和修改。

在linux内核中的应用

在 Linux 内核中,typedef 被广泛用于简化复杂类型的定义,并提升代码的可读性。内核代码中使用了许多通过 typedef 定义的常见数据类型,以下是一些常用的 typedef 定义的数据类型:

1. 基本整数类型

Linux 内核中定义了一些固定大小的整数类型,确保在不同的硬件平台上能够保持一致性。

  • u8, u16, u32, u64: 无符号整数,分别为 8、16、32 和 64 位。

    typedef unsigned char u8; 
    typedef unsigned short u16; 
    typedef unsigned int u32; 
    typedef unsigned long long u64; 
  • s8, s16, s32, s64: 有符号整数,分别为 8、16、32 和 64 位。

    typedef signed char s8; 
    typedef signed short s16; 
    typedef signed int s32; 
    typedef signed long long s64; 

2. 布尔类型

内核中没有 C 标准库的 bool 类型,因此定义了自己的布尔类型。

  • bool: 定义布尔类型,用于表示 truefalse

    typedef _Bool bool; 
  • truefalse: 用于表示布尔值。

    #define true 1 
    #define false 0 

3. 大小和指针相关的类型

  • size_t: 表示对象大小的类型,通常用于内存分配函数中(如 mallockmalloc)。

    typedef unsigned long size_t; 
  • ssize_t: 与 size_t 类似,但它是有符号的,用于表示函数返回值,如读写函数的返回值。

    typedef long ssize_t; 
  • ptrdiff_t: 用于存储两个指针之间的差值。

    typedef long ptrdiff_t; 

4. 内核特定类型

  • pid_t: 用于表示进程 ID。

    typedef int pid_t; 
  • gid_t, uid_t: 分别用于表示组 ID 和用户 ID。

    typedef unsigned int gid_t; 
    typedef unsigned int uid_t; 

5. 内存管理相关类型

  • gfp_t: 用于表示内存分配标志,在内存分配函数中用来指定如何分配内存。
    typedef unsigned int gfp_t; 

6. 时间相关类型

  • time_t: 用于表示时间值,通常是自 Unix 纪元以来的秒数。

    typedef long time_t; 
  • clock_t: 用于表示时钟周期数。

    typedef long clock_t; 
  • ktime_t: 表示内核时间的一种类型,用于高精度时间操作。

    typedef s64 ktime_t; 

7. 页帧和物理地址相关类型

  • pfn_t: 表示页面帧编号(Page Frame Number),与物理内存地址相关。

    typedef unsigned long pfn_t; 
  • phys_addr_t: 表示物理内存地址。

    typedef unsigned long phys_addr_t; 

8. 位操作相关类型

  • u64atomic_t: 用于位操作和原子操作。u64 是 64 位无符号整数,atomic_t 是内核定义的原子类型,用于保证多核环境下的原子操作。
    typedef struct { int counter;} atomic_t; 

这些 typedef 定义不仅让代码更简洁,还增强了可移植性和可维护性,使内核代码在不同架构上运行时具有一致的行为。

其他类型

在 Linux 内核中,为了处理不同硬件平台可能采用的不同字节序(大端或小端),定义了许多与字节序相关的类型。字节序决定了多字节数据在内存中的存储顺序。以下是通过 typedef 定义的用于小端序(Little Endian)处理的常用类型:

1. 小端序的整数类型

这些类型专门用于表示小端序的固定大小整数,确保在不同平台上能够正确处理内存中的数据字节顺序。

  • __le16: 16 位无符号小端整数

    typedef __u16 __le16; 
  • __le32: 32 位无符号小端整数

    typedef __u32 __le32; 
  • __le64: 64 位无符号小端整数

    typedef __u64 __le64; 
2. 与大小端无关的基础类型

在内核中,还定义了一些无关大小端的基础类型,方便在大小端环境中进行跨平台处理。

  • __u8: 8 位无符号整数,字节序不相关,因为 8 位不需要考虑字节序。

    typedef unsigned char __u8; 
  • __u16: 16 位无符号整数

    typedef unsigned short __u16; 
  • __u32: 32 位无符号整数

    typedef unsigned int __u32; 
  • __u64: 64 位无符号整数

    typedef unsigned long long __u64; 
3. 大端序的整数类型

虽然你问的是小端序,但为了完整性,这里也列出常用于大端序处理的类型。

  • __be16: 16 位无符号大端整数

    typedef __u16 __be16; 
  • __be32: 32 位无符号大端整数

    typedef __u32 __be32; 
  • __be64: 64 位无符号大端整数

    typedef __u64 __be64; 
4. 类型转换辅助函数

为了确保在不同平台上处理数据时能够正确转换字节序,Linux 内核中还提供了很多字节序转换的辅助函数:

  • 小端转 CPU 本地字节序:

    • le16_to_cpu():将小端 16 位数据转换为 CPU 本地字节序。
    • le32_to_cpu():将小端 32 位数据转换为 CPU 本地字节序。
    • le64_to_cpu():将小端 64 位数据转换为 CPU 本地字节序。
  • CPU 本地字节序转小端:

    • cpu_to_le16():将 CPU 本地 16 位数据转换为小端序。
    • cpu_to_le32():将 CPU 本地 32 位数据转换为小端序。
    • cpu_to_le64():将 CPU 本地 64 位数据转换为小端序。

这些 typedef 和字节序转换函数有助于处理网络协议、文件格式以及跨平台开发中的数据传输问题,确保数据能够正确地在不同字节序的系统中存储和读取。

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

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

相关文章

ARM单片机的内存分布(重要)

ARM单片机的内存分布(重要) 一、S32K344的内存布局 MEMORY {int_pflash : ORIGIN 0x00400000, LENGTH 0x003D4000 /* 4096KB - 176KB (sBAF HSE)*/int_dflash : ORIGIN 0x10000000, LENGTH 0x00020000 /* 128KB …

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开,发现是一段PT2242 信号 PT2242信号 有长有短,短的为0,长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》,2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W,而私营单位就业人员平均月薪只有5.7K左右。 图源:…

两数之和、三数之和、四数之和

目录 两数之和 题目链接 题目描述 思路分析 代码实现 三数之和 题目链接 题目描述 思路分析 代码实现 四数之和 题目链接 题目描述 思路分析 代码实现 两数之和 题目链接 LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 题目…

EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(一)

摘要 EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势,通过一系列高效的设计改进和搜索方法,实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受…

Redis-01 入门和十大数据类型

Redis支持两种持久化方式:RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上,可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照,可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs

代码思路是受一个洛谷题解里面大佬的启发。应该算是一个dfs和回溯的入门题目&#xff0c;很好的入门题目了下面我会先给我原题解思路我想可以很快了解这个思路。下面是我自己根据力扣大佬写的。 我会进行详细讲解并配上图辅助理解大家请往下看 #include<iostream> #inc…

初始MYSQL数据库(7)—— 视图

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 引言 前面我们学习MySQL数据库时&#xff0c;创建表之后&#xff0c;会在表中插入数据&#xff0c;在需要的时候&#xff0c;也会进行…

python文字转wav音频

借鉴博客 一.前期准备 1. pip install baidu-aip 2. pip install pydub 3. sudo apt-get install ffmpeg 二.代码 from aip import AipSpeech from pydub import AudioSegment import time#input your own APP_ID/API_KEY/SECRET_KEY APP_ID 14891501 API_KEY EIm2iXtvD…

示例:WPF中Grid显示网格线的几种方式

一、目的&#xff1a;介绍一下WPF中Grid显示网格线的几种方式 二、几种方式 1、重写OnRender绘制网格线&#xff08;推荐&#xff09; 效果如下&#xff1a; 实现方式如下&#xff1a; public class LineGrid : Grid{private readonly Pen _pen;public LineGrid(){_pen new P…

【Linux】深度解析与实战应用:GCC/G++编译器入门指南

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

RabbitMQ08_保证消息可靠性

保证消息可靠性 一、生产者可靠性1、生产者重连机制&#xff08;防止网络波动&#xff09;2、生产者确认机制Publisher Return 确认机制Publisher Confirm 确认机制 二、MQ 可靠性1、数据持久化交换机、队列持久化消息持久化 2、Lazy Queue 惰性队列 三、消费者可靠性1、消费者…

速通LLaMA3:《The Llama 3 Herd of Models》全文解读

文章目录 概览论文开篇IntroductionGeneral OverviewPre-TrainingPre-Training DataModel ArchitectureInfrastructure, Scaling, and EfficiencyTraining Recipe Post-TrainingResultsVision ExperimentsSpeech Experiments⭐Related WorkConclusionLlama 3 模型中的数学原理1…

细说硫酸钙防静电地板的材质结构和优势特点

防静电地板有全钢基材的、硫酸钙基材的、铝合金基材的&#xff0c;在一些防静电要求、承载要求、铺设要求、铺装效果要求很高的场合&#xff0c;如银行、电信机房、移动机房、智能化办公室、部队指挥中心&#xff0c;通常都会使用硫酸钙防静电地板。那么什么是硫酸钙防静电地板…

计算机毕业设计 二手图书交易系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

arthas-阿里远程诊断工具神器一定要掌握

文章目录 1. 背景介绍2. 安装下载3. 常用命令4. 常见案例4.1 案例一&#xff1a;使用logger 实时修改某个类的日志级别、4.2 案例二&#xff1a;使用watch 查看方法输入输出参数4.3 案例三&#xff1a;使用 Arthas 实现在线代码热更新 1. 背景介绍 通常&#xff0c;本地开发环…

文件上传、amrkdown编辑器

一、文件上传 这里我以图片为例&#xff0c;进行上传&#xff0c;上传到阿里云oss&#xff08;对象存在中&#xff09; 首先&#xff0c;我们先梳理一下&#xff0c;图片上传的流程 1、前端选择文件&#xff0c;提交文件 前端提交文件&#xff0c;我们可以使用ElementUI中的…

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性

知识点&#xff1a; 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注&#xff1a;传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址&#xff1a;http…

有关 签到/签退 业务逻辑 的梳理与学习

导言 最近搞到了个签到管理&#xff0c;其中的业务逻辑感觉有点复杂(可能是我的方向不对),虽然是实现了&#xff0c;不过代码和逻辑很多&#xff0c;也有些乱&#xff0c;想趁着还记得逻辑来记录梳理一下&#xff0c;看看自己以后有没有更好的思路&#xff0c;或者有大佬有思路…