C语言中 typedef 关键字

在C语言中,typedef 关键字用于为现有数据类型定义新的别名(类型重命名),其核心目的是‌提高代码可读性‌和‌简化复杂类型的声明‌。以下是其用法详解及典型场景:

1.基本语法‌

typedef original_type new_type_name;
‌original_type‌:可以是基本类型(如 int)、结构体、联合体、枚举,甚至是函数指针或数组。
‌new_type_name‌:用户自定义的类型别名。

2.典型用法与示例‌

1) ‌简化基础类型名称‌

typedef unsigned int uint32_t;  // 定义无符号32位整数别名
uint32_t counter = 0;          // 等同于 unsigned int counter = 0;
‌用途‌:增强代码可读性,尤其在跨平台开发中统一类型(如 int32_t, uint8_t)。

2. )为结构体/联合体/枚举定义别名‌
避免重复书写 struct、union 或 enum 关键字:

// 未使用 typedef
struct Point {int x;int y;
};
struct Point p1;  // 必须带 struct// 使用 typedef
typedef struct {int x;int y;
} Point;          // 别名 Point 代替 struct {...}
Point p2;         // 直接使用别名

3. )简化复杂类型声明‌
尤其适用于‌函数指针‌、‌数组指针‌等复杂类型:

// 定义函数指针类型别名
typedef int (*MathFunc)(int, int);  
int add(int a, int b) { return a + b; }
MathFunc func_ptr = add;  // 直接通过别名声明函数指针
// 定义数组指针别名
typedef int (*Array3Ptr)[3];  
int arr[3] = {1, 2, 3};
Array3Ptr ptr = &arr;     // 指向长度为3的数组的指针

4. )跨平台可移植性‌
统一不同平台下的数据类型:

#ifdef WIN32typedef __int64 int64_t;
#elsetypedef long long int64_t;
#endifint64_t timestamp;  // 代码无需关心具体平台类型

‌与 #define 的区别‌

特性typedef#define
‌作用阶段‌编译期(类型检查)预处理期(文本替换)
‌作用域‌遵循块作用域(可局部或全局)从定义处开始全局替换
‌类型安全‌✔️ 编译器会检查类型匹配❌ 纯文本替换,无类型检查
支持复杂类型‌✔️ 可重命名结构体、指针等复合类型❌ 仅支持简单替换

‌示例‌:

typedef int* IntPtr;
#define INT_PTR int*IntPtr a, b;    // a 和 b 均为 int* 类型
INT_PTR c, d;   // c 是 int*,d 是 int(因宏展开为 int* c, d)

‌最佳实践‌

‌结构体/枚举优先使用 typedef‌
避免冗余的 structenum 前缀。

‌为复杂类型定义清晰别名‌

如函数指针、多维数组指针等,提升代码可维护性。

‌避免过度使用‌

对简单类型(如 int)无需滥用 typedef,除非有明确的可读性或跨平台需求。

‌命名风格‌
类型别名通常以 _t 结尾(如 size_t),但不是强制要求。

‌注意事项‌
‌作用域规则‌:typedef 遵循C语言的作用域规则,可在函数内局部定义。

void func() {typedef float Meter;  // 仅在 func() 内有效Meter distance = 5.5;
}

‌与C++的差异‌:C++中 struct 名称可直接作为类型名,无需 typedef。

‌总结‌
typedef 的核心价值在于‌通过类型抽象提升代码清晰度‌,尤其在处理复杂类型时,能显著降低代码冗余和出错概率。合理使用它是编写高质量C代码的重要技巧。

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

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

相关文章

Learning vtkjs之TubeFilter

过滤器 沿着线生成管道 介绍 vtkTubeFilter - 一个在每条输入线周围生成管的过滤器 vtkTubeFilter是一个在每条输入线周围生成管的过滤器。管由三角形条带组成,并随着线法线的旋转而旋转。如果没有法线存在,它们会自动计算。管的半径可以根据标量或向…

python常用科学计算库及使用示例

​一、NumPy - 数值计算基础库​​ ​​安装​​ pip install numpy ​​核心功能示例​​ 1. 数组创建与运算 import numpy as np# 创建数组 arr np.array([1, 2, 3, 4]) matrix np.array([[1, 2], [3, 4]])# 数学运算 print(arr 1) # [2 3 4 5] print(matrix …

中科院黄飞敏等人证明希尔伯特第六问题使用的或然判断(估计)-没有使用演绎推理的必然判断

国家自然科学基金委在2013年介绍黄飞敏的工作,居然是错误的:黄飞敏等人73页的论文,全篇都是用或然判断的“估计”代替必然判断的演绎证明,将没有实验的推演当成事实。 首页 >>年度报告 >>2013年度报告 >>第二部…

【安装指南】Chat2DB-集成了AI功能的数据库管理工具

一、Chat2DB 的介绍 Chat2DB 是一款开源的、AI 驱动的数据库工具和 SQL 客户端,提供现代化的图形界面,支持 MySQL、Oracle、PostgreSQL、DB2、SQL Server、SQLite、H2、ClickHouse、BigQuery 等多种数据库。它旨在简化数据库管理、SQL 查询编写、报表生…

vite项目tailwindcss4的使用

1、安装taillandcss 前几天接手了一个项目,看到别人用tailwindcss节省了很多css代码的编写,所以自己也想在公司项目中接入tailwindcss。 官网教程如下: Installing Tailwind CSS with Vite - Tailwind CSS 然而,我在vite中按…

第 13 届蓝桥杯 C++ 青少组省赛中 / 高级组 2022 年真题

一、选择题 第 1 题 题目:已知char a; float b; double c;,执行语句c a b c;后变量c的类型是( )。 A. char B. float C. double D. int 正确答案:C 答案解析: 在 C 中,表达式运算会进行类型…

解决GoLand无法Debug的问题

文章目录 解决GoLand无法Debug的问题问题描述解决方案方法一:安装并替换Delve调试工具方法二:通过GoLand自动安装方法三:配置自定义Delve路径 验证解决方案常见问题排查总结 解决GoLand无法Debug的问题 问题描述 在使用GoLand进行Go语言开发…

5.2刷题

P1064 [NOIP 2006 提高组] 金明的预算方案 背包&#xff0b;附属品DP #include<bits/stdc.h> using namespace std; #define int long long int n, m, v, p, q; struct node{int id, v, s, f; }a[100]; int b[32010], dp[32010]; bool cmp(node a, node b){if(a.id b.…

轻舟系列FPGA加速卡:大模型分布式训练中的高效协同者

在超大规模模型&#xff08;如千亿级参数&#xff09;的分布式训练中&#xff0c;计算、存储与通信的协同优化是突破性能瓶颈的关键。绿算技术公司的轻舟系列FPGA加速卡凭借其低延迟、高能效和可编程特性&#xff0c;能够成为分布式训练架构中的异构加速节点。其在训练集群中的…

序列数据(Sequential Data)​​:按顺序排列的动态信息载体

核心定义​​ 序列数据是​​按特定顺序排列​​的数据集合&#xff0c;其中元素的​​位置或时间顺序​​蕴含关键信息。例如&#xff1a; ​​时间序列​​&#xff1a;股票价格、气温变化&#xff08;按时间戳排列&#xff09;。​​文本​​&#xff1a;句子中的词语序列…

【单片机数码管实现第一位开始走0~9,1s后第二位再开始亮】2022-5-2

缘由怎么让单片机数码管实现第一位开始走0~9,1s后第二位再开始亮? - 24小时必答区 #include "REG52.h" void sm7447(unsigned char mz, unsigned char w) {unsigned char Xd0;P2255;P2mz;P3w;while(Xd); } void main() {unsigned char jz0,zhi128;unsigned int Ys4…

InnoDB索引的原理

在鹅厂后端开发一面&#xff0c;我遇到了如题这样一个比较宽泛的问题&#xff0c;当时可能只是背了相关概念&#xff0c;对于索引的了解不是很深刻。 最近&#xff0c;我花了很大的功夫去深入了解MySQL的索引。 下面是我的一些思考&#xff1a; 索引&#xff0c;对于InnoDB来说…

FormCalc 支持的编程语言和软件

FormCalc 是一种专为 PDF 表单计算设计的脚本语言&#xff0c;主要应用于 Adobe 生态及 SAP 相关工具。以下是支持 FormCalc 的主要软件和平台&#xff1a; 1. Adobe LiveCycle Designer&#xff08;最佳支持&#xff09; 原生支持&#xff1a;FormCalc 是 LiveCycle Designe…

unity 为什么不切片 Sprite.rect 与Sprite.textureRect的值还不一样

一。测试代码&#xff1a; 二。发现Debug不一样的原因 与解决方案&#xff1a; 下图右边所示&#xff1a; 网格类型默认为紧密 在 Unity 中&#xff0c;纹理导入时可能存在自动的偏移和裁剪设置。即便你没有手动切片&#xff0c;Unity 可能会根据纹理的导入设置&#xff0c;对…

超预期!淘宝闪购提前开放全国全量,联合饿了么扭转外卖战局

饿了么由守转攻。 作者|景行 编辑|杨舟 淘宝饿了么&#xff0c;终于落子&#xff0c;“淘宝闪购”&#xff0c;横空出世&#xff0c;仅仅2天&#xff0c;业务加速。 4月30日上午&#xff0c;当外卖战场陷入沉寂时&#xff0c;淘宝宣布将即时零售业务“小时达”升级为“淘宝闪…

minio相关面试问题和参考答案

可以考虑以下几个方面&#xff1a; MinIO概述与特性MinIO与其他对象存储的比较MinIO的使用场景MinIO的API与SDKMinIO的安全性与权限管理MinIO的性能优化 以下是一些相关的面试技术问题及其参考回答&#xff1a;具体如下&#xff1a; MinIO的主要特性包括&#xff1a; 高性能&am…

加载ko驱动模块:显示Arm版本问题解决!

1、问题 驱动模块加载&#xff0c;使用命令&#xff1a;modprobe chrdevbase.ko 时出现&#xff1a; hrdevbase: version magic 4.1.15 SMP preempt mod_unload modversions ARMv6 p2v8 ’ should be 4.1.15 SMP preempt mod_unload modversions ARMv7 p2v8 ’ ———————…

【论文阅读一】掌握高效阅读法,开启学术研究新旅程:S. Keshav教授论文阅读的三遍法

文章目录 一、三遍阅读法1. 初读&#xff1a;10分钟&#xff1a;宏观把握&#xff0c;快速筛选2. 第二遍&#xff1a;1个小时&#xff1a;更仔细的阅读&#xff0c;了解文中论点3. 第三遍&#xff1a;深入理解&#xff0c;注重细节&#xff0c;挑战假设 二、运用三遍阅读法进行…

3D Gaussian Splatting部分原理介绍和CUDA代码解读

本系列旨在帮助无CUDA代码经验的读者、以及3DGS的初学者理解代码逻辑。 3D GS论文原文链接&#xff1a;https://arxiv.org/abs/2308.04079 论文笔记链接&#xff1a;【论文笔记】3D Gaussian Splatting for Real-Time Radiance Field Rendering 【论文笔记】A Survey on 3D Ga…

【数据结构】--- 双向链表的增删查改

前言&#xff1a; 经过了几个月的漫长岁月&#xff0c;回头时年迈的小编发现&#xff0c;数据结构的内容还没有写博客&#xff0c;于是小编赶紧停下手头的活动&#xff0c;补上博客以洗清身上的罪孽 目录 前言&#xff1a; 概念&#xff1a; 双链表的初始化 双链表的判空 双链表…