0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一句话帮你理解 typedef 的用法

丫丫119 来源:未知 作者:肖冰 2019-09-19 14:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

C语言中typedef用来给复杂声明定义别名非常的方便,不过有时候typedef在复杂声明中不好理解。本文关键的一句话帮你理解ytpedef的用法。

typedef常见应用场景

在这之前,我们来看看一些常见应用场景。

为特定含义的类型取别名

例如,假设速度是整型值:

typedefintSpeedType;

那么你就可以像下面这样使用了:

#include
typedefintSpeedType;
intmain(void)
{
SpeedTypes=10;
printf("speedis%dm/s",s);
return0;
}

在main函数中,你可以直接使用SpeedType作为一种类型来定义变量了。有人可能问了,为什么要这样,直接使用int不是更好吗?那么如果你的代码中很多地方都用到了这个,但是突然有一天不再使用int,而是使用long呢?是不是直接修改typedef部分就可以了?(当然打印的地方也需要变,可自定义打印函数),另外一方面,通过SpeedType这个名字就可以非常直接的读懂变量的含义。

事实上,size_t,socklen_t等类型都是类似的定义。

说到typedef,就需要提一下define了,define只是一个字符串简单替换。当然下面这样的例子你可能见过很多次了:

#definePIONTERint*
PIONTERa,b;//等同于int*a,b;
typedefint*POINTER1
POINTER1c,d;//等同于int*c;int*d;

为结构体取别名

这个也比较常见,不过有的人认为,为结构体取别名并不是一个明智的选择,因为它在使用的时候不能直观看到它是结构体类型了。

structinfo
{
charname[128];
intlength;
};

那么你在声明变量的时候,需要带上struct,即像下面这样使用:

structinfovar;

但是如果你用typedef取个别名呢?

typedefstructinfo
{
charname[128];
intlength;
}Info;

你就可以像下面这样使用了:

Infovar;

声明函数指针类型

前面的都很好理解,那么来看看函数指针:

typedefvoid*(*Fun)(int,int);

这里将返回类型为void *,入参为int的函数类型命名为Fun,那么在其他地方,就可以像下面这样使用啦:

//来源:公众号【编程珠玑】,博客地址:https://www.yanbinghu.com
#include
typedefvoid*(*Fun)(int,int);
void*test(inta,intb)
{
printf("%d,%d
",a,b);
//dosomething
returnNULL;
}
intmain(void)
{
Funmyfun=test;//这里的Fun已经是一种类型名了
myfun(1,1);
return0;
}

是不是发现跟前面的不一样了呢?类型别名的位置飘忽不定,有的在最后,有的在中间。

当然typedef的场景并不限于以上几种,这里仅仅是举例。

一句话理解

我不知道你是不是已经完全理解了前面的场景,无论理解与否,这句话都能很好的帮助你再次理解前面的内容:

typedef中声明的类型在变量名的位置出现

什么意思呢,我们回头来看。我们是怎么声明int类型变量的?

intTypename;

像上面这样,对不对?那么用typedef之后呢?把变量名的位置替换为别名:

typedefintTypename;

好了,你现在已经把为int取别名为Typename。

再来看结构体,声明普通结构体变量:

structinfo
{
charname[128];
intlength;
};
structinfoTypename;

用typedef取别名,别名取代变量名的位置:

structinfo
{
charname[128];
intlength;
};
typedefstructinfoTypename;

好了,你现在已经为struct info取别名为Typename。
当然这可能我们平常通常使用下面这种写法:

typedefstructinfo
{
charname[128];
intlength;
}Typename;

再来看函数指针类型,我们平常是如何声明函数的?

void*function(int,int);

那么使用typedef取别名呢?用别名取代函数名的位置即可:

void*(*Fun)(int,int);

不过这里需要注意用括号将这个别名括起来,并在前面加*号。

总结

至此,相信你对typedef的使用有了更清晰的认识了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • typedef
    +关注

    关注

    0

    文章

    26

    浏览量

    9842
  • main
    +关注

    关注

    0

    文章

    38

    浏览量

    6556
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    EMMI-InGaAs 与 OBIRCH:分钟教你看懂两款失效定位设备原理与应用

    一句话区别总结 EMMI 看光 → 漏电、击穿这类“会发光的异常” OBIRCH 看热 → 金属短路、高阻这类“无光但致命的问题”
    的头像 发表于 12-05 16:21 123次阅读
    EMMI-InGaAs 与 OBIRCH:<b class='flag-5'>一</b>分钟教你看懂两款失效定位设备原理与应用

    一句话,多个命令同时执行,AI语音模组也能多任务处理?

    、 Ai-WV02-32S   将语音识别、唤醒、语义理解等核心功能, 浓缩在颗小小的模组中。 安信可AI语音模组支持 MCP 协议(Multi Command Processing,多命令并行处理) ,让语音交互从“单线程”进化为真正的“多任务协同”!
    的头像 发表于 10-31 14:45 243次阅读
    <b class='flag-5'>一句话</b>,多个命令同时执行,AI语音模组也能多任务处理?

    真正免费的AI生成PPT工具盘点:告别收费陷阱

    的战斗机",其他9款工具也各有绝活,保证让你告别收费陷阱,轻松做出专业级PPT! 、AiPPT:一句话生成PPT的"时间管理大师" 一句话生成,分钟出片 作为北京饼干科技旗下的"A
    的头像 发表于 10-30 15:43 5443次阅读
    真正免费的AI生成PPT工具盘点:告别收费陷阱

    智多晶SA5T-200 FPGA开发板重磅发布

    在科技飞速发展的今天,硬件与软件的融合正不断重塑我们的世界。而在芯片领域,流传着这样一句话:“软件定义世界,FPGA定义未来”。
    的头像 发表于 10-11 11:45 590次阅读

    批准L3级自动驾驶上路意味着什么?

    [首发于智驾最前沿微信公众号]最近,工业和信息化部等八部门印发的《汽车行业稳增长工作方案(2025—2026年)》里有一句话,引起了不少人的注意,那就是“有条件批准L3级车型生产准入”。看似不经意
    的头像 发表于 09-16 09:28 496次阅读
    批准L3级自动驾驶上路意味着什么?

    一句话了解21种计算模式

    、智能化趋势、安全与可持续四个维度,梳理了21种计算模式,并尽量用通俗易懂的一句话向您介绍每种模式的定义。架构与资源维度并行计算:把大任务拆成多个小任务,让多颗处理器
    的头像 发表于 08-06 14:31 509次阅读
    <b class='flag-5'>一句话</b>了解21种计算模式

    2025 AI主战场,连锁门店“变形记”

    让业务驾驭AI,当大模型的价值通过“取汉堡更快”“一句话点咖啡”来实现,这场技术变革才算真正落地
    的头像 发表于 07-24 12:41 1086次阅读
    2025 AI主战场,连锁门店“变形记”

    一句话秒出PPT“的荣耀YOYO,AI生产力有多强?

    释放AI生产力,荣耀让智能体告别发布会炫技
    的头像 发表于 07-14 14:15 2291次阅读
    “<b class='flag-5'>一句话</b>秒出PPT“的荣耀YOYO,AI生产力有多强?

    CYW55513是否支持linux4.4?

    开始支持55513的驱动版本是Infineon Linux Wi-Fi驱动程序(FMAC)(v2024_1115) 但在发行说明中有一句话 从内核版本 4.14 到内核版本 6.1.97 的反向移植支持 说明backport是不支持4.4的,我想确认下是否有驱动能支持l
    发表于 06-05 07:26

    使用FX3 SDK发布源代码是否违反许可?

    使用 FX3 SDK 发布源代码是否违反许可? CYPRESS™EZ-USB™ FX3 SDK1.3licenselicense.txt ”4. 专有权利; 到“您同意对源代码保密。” 那里写着一句话,所以我想问下以确定。
    发表于 05-08 06:54

    求助,关于ADS1232的PDWN问题求解

    各位专家好!请教个问题: 在ADS1232的数据手册中看到一句话,“AVDD must be powered up at least 10us before PDWN goes high
    发表于 02-13 08:20

    想读ADS1248寄存器写入的值,是否必须改变SPI工作模式?

    我在ADS1248手册的53页看到这样的一句话,It is not possible to use the full-duplex nature of the SPI interface when
    发表于 01-09 07:45

    使用ADS1220设计款电路用来采集个电阻桥式传感器,使用内部的2.048V基准作为基准电压?

    请教个问题。我使用ADS1220设计款电路用来采集个电阻桥式传感器。设计的时候我想使用内部的2.048V基准作为基准电压,以下为电路图。 但是我在看技术手册的时候,有这么一句话
    发表于 01-06 06:00

    更换FT4232之后ADC12DJ3200EVM板卡USB连不上怎么解决?

    ,看到下面一句话。 Use the free FT_PROG software from FTDI chip and verify that the onboard FTDI chip
    发表于 12-20 14:12

    ADS1232的XTAL1和XTAL2怎么接?

    打算用到外部时钟,这里该如何接了,我看到一句话 那么是不是需要单片机的I/O口要连到XTAL1上才行了?? 正确的接法是不是Xtal1和XTAL2间接个晶振,然后还需要单片机个口线接到XTAL1? 单片机给什么信号能让它用外部晶振了?给高?? 因为XTAL1接低的话
    发表于 12-20 12:35