分析:c语言定义typedef给类型起别名的原因(重点论述:不透明类型(封装))
最近我在看linux内核源码里面大量代码直接使用了结构体或者共用体类型的原始类型名也就是带着关键字“struct”、“union”、“enum”等这样有个好处就是我们一读到类型名因为有前缀所以一眼就看出是什么类型相对比使用typedef给类型名起另外一个别名因为隐藏了struct、union、enum等关键字我们无法一眼就看出是结构体类型、枚举类型、共用体类型。因此就有了这样的一个疑问c语言发明typedef给类型起别名有哪些好处呢什么情况下需要使用typedef给定义的类型再起一个别名呢首先前提typedef只声明了一种已存在数据类型的别名而非定义了一种新类型。1原因1为了风格统一。试想一下这样一个场景一个公司给了一堆已经编写好的库文件他们公司有自己的编写风格因此定义的结构体类型、枚举类型、共用体类型都有自己特有的前缀或者后缀但是我们自己的公司也有一套自己的命名规则那么怎样做的统一呢答案是使用typedef给供应商公司的结构体类型起一个我们自己公司的别名。2原因二简化复杂类型别名。可能有人要问了类型名有多复杂不就是struct、union、enum关键字后面跟着的单词吗我想说的是函数类型函数类型有关键字、参数列表参数列表可能有很长一串如果没用typedef给函数类型起一个别名每次使用函数指针类型的时候都要输出一长串太复杂了也太费劲了。typedef struct node *node_ptr; typedef int (*cmp_fn)(const void*,const void*);使用typedef给函数类型起一个别名后后面用到定义一个函数指针类型的变量的时候就简单了直接使用cmp_fn *fn1; cmp_fn fn2;这样写起来就非常简单。从这里也得出2个心得一个就是c语言可以将函数也看成一个数据类型变量名的方式也就是一切解释数据。另外一个是函数类型其实就是一个指针类型指针类型都是一种类型都只占4字节内存空间。当然了使用typedef给结构体指针类型取别名还有个好处就是可以省略了struct和“*”不用没有都输入这个也能一定程度上简化代码但是也带来了一个负面影响就是如果类型别名没有前后缀提示很难一眼就看出是普通类型变量还是指针类型的变量。3便于代码替换升级修改。试想这样一个场景typedef给某一种类型起别名后使用这个别名完成了大量函数编写也就是有很多地方都使用了这个类型别名如果后面我们想用另外一个原类型替代现在的类型那就比较简单直接在typedef中将原类型进行替换就可以使用变量类型别名的地方根本不用改动。如果没有使用typedef给原类型起别名那就需要对代码中所有“struct 原类型名”的地方全部进行替代修改很容易出错。4重点前向声明和不透明类型封装什么是不透明类型也就是结构体类型内部有哪些成员是不知道的隐藏的。试想一个这样的一个场景我们只想将头文件公布给客户而不想让他们知道结构体类型内部有哪些成员。这个时候就用到了不透明类型以及前向声明具体做法如下。counter.h头文件// 1. 前向声明告诉编译器 Counter 是一个结构体类型但暂不披露细节 typedef struct Counter_t Counter;一系列API函数中的返回值或者参数列表中使用到了“foo_t *”指针类型。// 创建计数器返回指针内存由库管理 Counter* counter_create(int initial_value); // 销毁计数器 void counter_destroy(Counter* c); // 增加计数 void counter_increment(Counter* c); // 获取当前值 int counter_get_value(const Counter* c);关键这些API函数包含了所有原结构体类型Counter_t定义的结构体类型变量内部成员的读写操作。如果另外一个公司想使用直接包含这个counter.h头文件然后定义结构体Counter *类型指针变量直接调用这些API函数就可以实现所需功能。counter.c头文件#include stdlib.h #include counter.h // 3. 完整定义结构体只有这个 .c 文件知道 Counter 内部有一个 int 成员 struct Counter_t { int value; // 未来可以随意添加其他成员如 mutex、日志句柄等不影响头文件 int debug_flag; }; Counter* counter_create(int initial_value) { Counter* c (Counter*)malloc(sizeof(Counter)); // 这里需要知道 sizeof(Counter)所以必须在此处定义 if (c) { c-value initial_value; c-debug_flag 0; } return c; } void counter_destroy(Counter* c) { free(c); } void counter_increment(Counter* c) { if (c) { c-value; } } int counter_get_value(const Counter* c) { return c ? c-value : -1; }这就是常规操作了定义真正结构体类型结构体类型内部包含各种成员变量。然后实现各种API函数值得注意的是counter_create()函数中使用了sizeof(Counter),因为Counter_t在本函数定义之前已经完整定义了而且提前使用了typedef实现了前向声明操作因此不会编译失败。我们可以不公开这部分源文件代码也就是实现了细节隐藏。这就是不透明类型具体用法。注意使用不透明类型封装有一个缺点就是固化严重因为客户定义了指针类型的变量但是无法使用箭头运算符“-”直接访问结构体变量内部成员因为源文件未公开不知道内部有哪些参数只有一个结构体指针变量而且通过箭头运算符访问结构体内部成员都已经封装成了一个个API函数客户只能使用我们公司发放的API函数这就是使用不透明类型封装的缺点。客户其他公司操作。main.c#include counter.h #include stdio.h int main() { // 正确使用指针因为头文件中声明了 typedef struct Counter Counter; Counter* my_counter counter_create(10); counter_increment(my_counter); printf(Value: %d\n, counter_get_value(my_counter)); counter_destroy(my_counter); // 错误以下代码会导致编译错误因为 main.c 看不到 struct Counter 的定义 // Counter local_counter; // Error: variable has incomplete type Counter // printf(%d, local_counter.value); // Error: member access into incomplete type return 0; }main.c客户代码中定义了结构体类型的指针变量使用各种我们公开的API函数实现客户功能而没有使用-运算符的。当然如果使用Counter定义结构体类型的变量编译器也会直接报错因为找不到类型定义。头文件是原地展开的可以从这个角度理解编译器为什么报错

相关新闻

AI绘画工具文化细节测试:以白无垢和服生成为例

AI绘画工具文化细节测试:以白无垢和服生成为例

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚这个测试到底在验证什么 看到“舞萌ai测试”这个标题,很多人第一反应可能是舞蹈动作生成或者角色换装。但从“…

2026/7/7 5:38:11阅读更多 →
三步突破:如何用Winhance中文版彻底释放Windows隐藏性能

三步突破:如何用Winhance中文版彻底释放Windows隐藏性能

三步突破:如何用Winhance中文版彻底释放Windows隐藏性能 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…

2026/7/7 5:38:11阅读更多 →
转录组才是隐藏的 “高分王者”

转录组才是隐藏的 “高分王者”

在竞争愈发激烈的科研中,bulk RNA-seq 仍是高分文章的核心技术支撑之一。凌恩生物协同客户的研究案例(涵盖医学、作物环境、药用植物三大领域)表明,通过 “技术深化 思路创新 多维度验证” 的组合策略,能让传统转录组…

2026/7/7 5:38:11阅读更多 →
OpenCV 4.8 图像增强实战:3种空间域与5种频率域滤波器效果对比

OpenCV 4.8 图像增强实战:3种空间域与5种频率域滤波器效果对比

OpenCV 4.8 图像增强实战:3种空间域与5种频率域滤波器效果对比在医疗影像分析和工业检测领域,图像质量直接影响诊断精度和缺陷识别率。2023年IEEE Transactions on Image Processing的研究表明,合理选择滤波器可使CT图像的病灶检出率提升23%。…

2026/7/7 6:48:17阅读更多 →
借助ChatGPT可以生成靠谱的参考文献了,3小时写好文献综述不再痛苦!

借助ChatGPT可以生成靠谱的参考文献了,3小时写好文献综述不再痛苦!

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。 在学术研究中,高效生成文献综述和整理参考文献是每位学术写作朋友…

2026/7/7 6:48:17阅读更多 →
Silverlight 3 Beta 新特性解析(2)-Graphics篇

Silverlight 3 Beta 新特性解析(2)-Graphics篇

如何利用新的Bitmap API来创建我们自己的图像透视3D图像(Perspective 3D Graphic)像素模糊和投影效果Element-To-Element Binding Bitmap API的写图像功能: 新版的Bitmap API支持从写每个像素的值来创建自己的图像 这个用来支持生成Bitmap的类叫做WriteableBitma…

2026/7/7 6:48:17阅读更多 →
UNet++ 深度监督与剪枝实战:在细胞分割数据集上实现 3 种剪枝策略对比

UNet++ 深度监督与剪枝实战:在细胞分割数据集上实现 3 种剪枝策略对比

UNet深度监督与剪枝实战:3种策略在细胞分割中的量化对比1. 深度监督与模型剪枝的核心价值医学图像分割领域近年来最显著的突破之一,就是UNet提出的深度监督机制及其衍生的模型剪枝能力。传统UNet架构虽然通过编码器-解码器结构和跳跃连接实现了较好的分割…

2026/7/7 6:48:17阅读更多 →
信创市场CPU选型指南:华为、飞腾、海光、龙芯等6厂商2024年性能与生态实测对比

信创市场CPU选型指南:华为、飞腾、海光、龙芯等6厂商2024年性能与生态实测对比

信创CPU选型实战指南:六大国产处理器2024年性能与生态深度评测在信息技术应用创新(信创)产业快速发展的背景下,国产CPU正迎来前所未有的发展机遇。面对华为鲲鹏920、飞腾S5000、海光3号、龙芯3A6000、兆芯KX-7000等主流国产处理器…

2026/7/7 6:48:17阅读更多 →
.NET 10 的正则性能现在什么水平?我拿它和 Go、Python、C++、PCRE2 测了一轮

.NET 10 的正则性能现在什么水平?我拿它和 Go、Python、C++、PCRE2 测了一轮

所以我没有试图“复现原文结果”。原文数据不公开,就没法严肃复现。我这里做的是另一件事:用公开、确定性的规则合成一份数据,然后把所有代码放出来,让别人可以重新跑。数据生成脚本在仓库里,规则很简单:生…

2026/7/7 6:43:17阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →