C语言中的typedef简介

news2024/9/24 15:18:18

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.coloradmin.cn/o/2160682.html

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

相关文章

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

如何将Vue项目部署至 nginx

一、准备工作 1.确保安装了开发软件 VS Code(此处可查阅安装 VS Code教程),确保相关插件安装成功 2.安装Node.js 和创建Vue项目(此处可查阅安装创建教程) 3.成功在VS Code运行一个Vue项目(此处可查阅运行…

【LeetCode】动态规划—打家劫舍(附完整Python/C++代码)

动态规划—#198. 打家劫舍 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 在这个问题中,你是一个专业的小偷,计划偷窃沿街的房…

JinDouYun性能测试工具使用方法

1.功能介绍 2. 安卓端支持安卓6及以上的版本,ios支持大部分版本 3. 可以测试游戏,视频,普通应用的性能数据,数据精准,低延迟,无侵入 4.工具下载链接 筋斗云 5.后续功能添加,高版本支持&…

网页爬虫法律与道德:探索法律边界与道德规范

目录 引言 一、网络爬虫技术概述 1.1 定义与功能 1.2 技术原理 1.3 案例分析 二、网络爬虫的法律边界 2.1 合法性要求 2.2 刑事风险 2.3 案例分析 三、网络爬虫的道德规范 3.1 尊重版权和隐私 3.2 合理使用爬虫技术 3.3 透明度和社会责任 四、技术挑战与应对策略…

[linux 驱动]块设备驱动详解与实战

目录 1 描述 2 结构体 2.1 block_device_operations 2.2 gendisk 2.3 block_device 2.4 request_queue 2.5 request 2.6 bio 3.7 blk_mq_tag_set 3.8 blk_mq_ops 3 相关函数 3.1 注册注销块设备 3.1.1 register_blkdev 3.1.2 unregister_blkdev 3.2 gendisk 结构…

SpringBoot开发——整合Hutool工具类轻松生成验证码

文章目录 1、Hutool简介2、验证码效果展示2.1 扭曲干扰验证码2.2 线条干扰验证码2.3 圆圈干扰验证码3、验证码应用场景3.1. 用户注册与身份验证3.2. 支付验证3.3. 订单与物流通知3.4. 信息安全与隐私保护3.5. 通知与提醒3.6. 其他应用场景4、Hutool工具类实现验证码生成4.1 引入…

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue

TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全…

API公共开放平台设计

背景 随着业务发展未来会有更多的三方应用接入公司平台,目前为服务商定制的机制无法满足三方应用快速接入,所以需要一个更加通用的解决方案,开放平台势在必行。 目标 设计一套通用协议,可以支持其他应用快速接入。 说明 本方案旨在设计整体架构,以及对为何这样设计做…

React 理解 re-render 的作用、概念,并提供详细的例子解释

一、什么是 re-render 在 React 中 re-render(重新渲染) 是经常发生的行为,主要确保视图要时刻保持最新的数据来呈现。 但每次发生 re-render 也是有代价的,比如数据状态、focus 焦点、表单数据、都得重置, 遇到代码…

获取商品销量详情API:深入解析返回值,助力电商决策

在电商行业,了解商品的销量详情对于商家制定营销策略、优化库存管理和提升用户体验至关重要。通过调用获取商品销量详情的API接口,商家可以实时获取关键的销售数据,从而做出更加明智的决策。本文将深入解析获取商品销量详情API的返回值&#…

linux信号| 学习信号三步走 | 学习信号需要打通哪些知识脉络?

前言: 本节内容主要讲解linux下信号的预备知识以及信号的概念, 信号部分我们将会分为几个阶段进行讲解:信号的概念, 信号的产生, 信号的保存。本节主要讲解信号 ps:本节内容适合学习了进程相关概念的友友们进行观看哦 目录 什么是…

轻松重置 MySQL 8.0 Root 密码的简便方法!

在Windows环境下安装MySQL数据后,如果忘记了 MySQL 8.0 的 root 密码,不必担心!通过 --skip-grant-tables 和 named-pipe 模式登录后,只需几步简单的 SQL 命令即可重置密码:刷新权限表、修改密码、再刷新权限&#xff…

SpringBoot+Thymeleaf租房管理系统

> 这是一个基于SpringBootThymeleafBootstrap实现的租房管理系统。 > 功能比较完善,包括用户注册/登录、房源登记、账单费用配置、统计报告等功能。 > 模拟真实使用环境,包括了自然人与法人的身份证明录入、房产证信息录入、通过邮件推送月…

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning

论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …

学生网上选课系统设计与实现

学生网上选课系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装学生网上选课系统软件来发挥其…

托盘检测系统源码分享

托盘检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

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

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

牛客周赛 Round 61 (C++实现)

比赛链接:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) 文章目录 1.致十年后的我们1.1 题目描述1.2 思路1.3 代码 2.简单图形问题2.1 题目描述2.2 思路2.3 代码 3. 小红的机器人构造3.1 题目描述3.2 思路3.2.1 问题13.2.2 问题23…

力扣 中等 1901.寻找峰值II

文章目录 题目介绍题解 题目介绍 题解 需要明白一个事实:从任意一个点出发,可以经过一个递增路径,找到一个极大值点。 求出一行的最大值,如果这行最大值比上面的要小,那峰值(之一)就会在上面 …