一句话帮你理解typedef的用法-飞外网

前言

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

typedef常见应用场景

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

为特定含义的类型取别名

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

typedefintSpeedType;

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

#includetypedefintSpeedType;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*POINTER1POINTER1c,d;//等同于int*c;int*d;
为结构体取别名

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

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

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

typedefstructinfocharname[128];intlength;}Info;
你就可以像下面这样使用了:

Infovar;
声明函数指针类型

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

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

//来源:公众号【编程珠玑】,博客地址:https://www.yanbinghu.com#includetypedefvoid*(*Fun)(int,int);void*test(inta,intb)printf("%d,%d",a,b);//dosomethingreturnNULL;intmain(void)Funmyfun=test;//这里的Fun已经是一种类型名了myfun(1,1);return0;
是不是发现跟前面的不一样了呢?类型别名的位置飘忽不定,有的在最后,有的在中间。

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

一句话理解

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

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

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

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

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

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

structinfocharname[128];intlength;structinfoTypename;
用typedef取别名,别名取代变量名的位置:

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

typedefstructinfocharname[128];intlength;}Typename;
再来看函数指针类型,我们平常是如何声明函数的?

void*function(int,int);
那么使用typedef取别名呢?用别名取代函数名的位置即可:

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

总结

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


使用ecall触发中断,中断返回后还是执行ecall指令,导致不断触发ecall中断如何解决? /** 中断处理函数 */void Ecall_M_Mode_Handler(void) __attribute__((interrupt("machine")));void Ecall_U_Mode_Handl... 发表于 05-24 07:57 • 168次
RT-Thread Nano3.1.5在main函数中创建了两个线程但无法运行是为什么? 按照例程,在main函数中创建了两个线程/******************************************************************************* 发表于 05-13 10:40 • 1230次
CH32V307VCT6无法执行main方法是为什么? CH32V307VCT6 的板子,在评估板子 可以到main方法中,同样的程序在自己画的板子(加了外部晶振25MHZ)上进入到SetSys... 发表于 05-12 09:42 • 142次
请问如何在main里面判断lwip何时完成? 我试着跑kawaii_mqtt的demo用自动生成的代码,在main里面初始化mqtt并且连接服务器运行代码发现, kawaii在尝试连接server的... 发表于 04-29 10:04 • 2263次
main函数进行简单任务切换,出现stack overflow是什么原因 main函数中定义了几个简单任务:uint32_t main(){#if FIX_TASK_OVERFLOW==1 rt_thread_t low... 发表于 04-24 09:39 • 1485次
OpenHarmony动态库Sa服务拉起的main入口说明OpenHarmony 很多服务都是编译成动态库, 动态库服务,没有main函数入口。服务的拉起的入口在哪?以在线升级服务为例说... 发表于 04-02 11:03 • 976次
rtthread怎么把dac_vol_sample这个函数写到main里? #include #include #include #define DAC_DEV_NAME "dac1"/... 发表于 04-01 09:13 • 1202次
求助,请问main线程为什么不会被打断呢? 我在main线程里创建了俩个比main线程优先级高的线程,立即启动为什么会在main执行结束后再进入我创建的线程不应该是启动之后... 发表于 03-28 14:37 • 366次
在使用rtstudio进行调试的时候,无法在main自动暂停,手动点击暂停时,出现上图状况,并且单片机不正常工作新建工程进行测... 发表于 03-24 14:51 • 739次
如何恢复rt_thread_delete()删除的线程? 我在main函数中使用rt_thread_create()建立了两个线程(上电直接运行),现在我有一个命令是使用rt_thread_delete()删除rt_thr... 发表于 03-22 14:27 • 852次
C语言学习笔记---typedef 简介    在单片机和操作系统中 typedef 会经常用到,它可以为某一个类型自定义名称。和#defin.... 发表于 01-13 13:26 •
关于单片机为啥要把结构体用typedef重定义 关于单片机为啥要把结构体用typedef重定义--为已经存在的变量类型重新命一个别名struct s.... 发表于 01-13 13:09 •
STM32系列单片机在进入main函数前都在干些什么? 在刚开始学习单片机的时候,一直以为程序启动后就直接进入到了main函数,但是随着学习的深入才发现,程.... 发表于 11-23 18:21 • 242次
Typedef用法小结 非常不错的文档有着基本数据类型结构体enum与函数指针等等的Typedef相关用法. 发表于 11-02 11:36 • 527次
浅析RT-Thread针对不同架构芯片移植的方法 对于程序的上下文,可以理解为程序当前运行的现场。其现场里面主要包含的内容有,当前所有的寄存器状态,当.... RTThread物联网操作系统 发表于 03-18 17:41 • 2082次
首先先划定一下这个问题的讨论范围:C/C++语言 这篇文章主要讨论的是操作系统层面上对于进程、线程的.... strongerHuang 发表于 11-03 15:51 • 2355次
typedef的用法以及复杂声明 c语言中typedef的用法是为了为已知类型提供新类型,在ansi c标准中typedef被归为存储.... 发表于 03-10 16:58 • 472次
Linux下C语言共享库的位置无关实现原理分析 如何创建一个*可执行*的共享库 一文谈完了如何让共享库可直接执行,本文再来谈谈共享库的运行时位置无关.... Linux阅码场 发表于 11-28 16:20 • 2168次
首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值.... 单片机爱好者 发表于 11-02 10:38 • 2879次
如何解决STM32调试无法进入main函数的问题? 本文主要详细介绍了怎么解决STM32调试无法进入main函数的问题? 硬件攻城狮 发表于 10-05 10:06 • 10714次
C语言程序的main函数免费 本文档的主要内容详细介绍的是C语言程序的main函数免费。 发表于 09-26 14:48 • 580次
浅谈C语言return语句和main 函数的返回值 在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的.... 发表于 05-10 10:53 • 4211次
Typedef的用途和原声明举例及陷阱分析 typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目.... 发表于 04-14 07:34 • 854次
typedef和define的介绍及本质区别 对于都可以用来给对象取一个别名的Typedef和define来说,是有区别的。本文通过对typede.... 发表于 04-14 07:31 • 3705次
单片机编程的基本思路和写法 学习单片机最主要的是学习写程序的方法,程序的功能千变万化,是学不完的,只有掌握了一定方法,才能用这种.... 发表于 11-14 09:17 • 3466次
typedef struct的用法 typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。具体区别在于.... 发表于 11-09 17:20 • 1062次
typedef结构体定义 typedef为这个新的结构起了一个名字,叫MyStruct。typedef struct tagM.... 发表于 11-09 16:55 • 2732次
typedef的用法 typedef 有一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点.... 发表于 11-09 16:32 • 1197次
c语言中typedef的用法 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储.... 发表于 11-09 15:23 • 5136次
typedef和define区别 typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。它本身是一种存储.... 发表于 11-09 14:22 • 5471次
typedef是什么意思 typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。它本身是一种存储.... 发表于 11-09 14:03 • 7308次