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

    浏览量

    9527
  • main
    +关注

    关注

    0

    文章

    38

    浏览量

    6120
收藏 人收藏

    评论

    相关推荐

    文生视频Pika 1.0爆火!一句话生成视频,普通人也能当“导演”

    几乎不需要任何门槛,用户只需要输入一句话,就可以生成想要的各种风格的视频,并通过简单的描述,更改视频中的形象和风格。   Pika labs官方宣传视频效果图相当惊艳   一句话生成视频,颠覆传统视频制作   Pika成立于今年4月,创始人郭文景和联合创始人兼CTO Ch
    的头像 发表于 12-01 01:08 3641次阅读
    文生视频Pika 1.0爆火!<b class='flag-5'>一句话</b>生成视频,普通人也能当“导演”

    开关电源布线 一句话:要运行最稳定、波形最漂亮、电磁兼容性最好

    开关电源在布线上最大的特点是拓扑引起的高频(高压)强电流与控制级的弱电信号交织在起,首先要保证强电流的存在不干扰电源内部的控制信号,其次要尽量减少对外部的干扰(EMC)。一句话:要运行最稳定、波形
    的头像 发表于 10-28 14:06 984次阅读
    开关电源布线 <b class='flag-5'>一句话</b>:要运行最稳定、波形最漂亮、电磁兼容性最好

    双电源运放可以采用正负电压绝对值不相等的电源供电吗?

    其他的影响么? 还有就是手册上的下面一句话怎么理解? Analog Input Voltage Range . . . . . . . . . . . . . . . . . . . . . . . . . . . ±40V 难道我采用-5V,+12V给ina129供电输
    发表于 09-12 06:14

    求助,关于TLE2141的供电问题求解

    在TLE2141的DATASHEET中,在供电方面有一句话,Single or Split Supply . . . 4 V to 44 V,此句话不甚明确,虽然DATASHEET中有例子,可证明 此运放可5V单电源供电,我本人仍有疑问,40V单电源供电可否,请各位大拿
    发表于 09-09 06:46

    想把差分信号转为单端信号,不是音频信号,OPA365是否还可以使用呢?

    我想请教下,想把差分信号转为单端信号(频段在100-600KHz),不是音频信号,这款芯片是否还可以使用呢?另:用TINA想仿真OPA365对于所需频段差分信号得的放大效果是否满足实用性,但是搭建不通。可能刚上手,玩不转这款软件。所以想取捷径,问问诸位,我的第一句话可否回答
    发表于 08-27 06:33

    如何设计RC去耦的R和C的值?

    如何设计RC去耦的R和C的值,最后一句话的意思是负载电流的变化决定R和C的值,能举个例子怎么计算这个值吗?
    发表于 08-14 07:47

    esp32c3 vdd_spi如何作为gpio11使用?

    看到C3的手册里有这样一句话 当 VDD_SPI 无需为外部供电时,VDD_SPI 亦可作为 GPIO11 使用 请问 怎么设置呢? 在 arduino 中设定 pinMode(11
    发表于 06-17 06:27

    一句话让你理解线程和进程

    今天给大家分享下线程与进程,主要包含以下几部分内容:一句话说明线程和进程操作系统为什么需要进程为什么要引入线程图说明线程和进程的关系一句话让你
    的头像 发表于 06-04 08:04 997次阅读
    <b class='flag-5'>一句话</b>让你<b class='flag-5'>理解</b>线程和进程

    一句话概括DDR、LPDDR、GDDR的区别

    以DDR开头的内存适用于计算机、服务器和其他高性能计算设备等领域,目前应用广泛的是DDR3和DDR4;
    的头像 发表于 05-10 14:21 5152次阅读
    <b class='flag-5'>一句话</b>概括DDR、LPDDR、GDDR的区别

    三层交换机的工作原理 三层交换机不能完全取代路由器的原因

    三层交换机的工作原理可以用一句话概括为:”次路由,多次交换“。
    的头像 发表于 03-29 09:29 649次阅读

    NPN型三极管发射结电势和基极电流有关问题

    教材有一句话:发射结电势减小,导致基极电流减小 这句话如果单看三极管的输入特性曲线确实没问题,但是三极管实际工作的静态工作点Q是输入特性曲线和输入回路负载线的交点,这个时候减小,​​​​​​负载线
    发表于 03-23 09:36

    请问AD2428 TX crossbar是个什么功能?

    AD2428 TRM中,描述升采样功能的最后一句话时,提到了个TX crossbar功能,全文搜索crossbar只有这处,这是个什么功能?
    发表于 03-07 07:00

    RS触发器逻辑门组成和逻辑功能表

    RS是由两个或非门组成,而或非门的输出又作为另个或非门的输入。下面说一句对RS触发器理解最重要的一句话:或非门如果有个输入端为1,那么不
    的头像 发表于 03-05 17:35 1.1w次阅读
    RS触发器逻辑门组成和逻辑功能表

    一句话证明我是工程师?这不纯纯送分题

    晶振扬兴科技
    扬兴科技
    发布于 :2023年12月05日 18:57:33

    关于Python多进程和多线程详解

    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。
    的头像 发表于 11-06 14:46 782次阅读
    关于Python多进程和多线程详解