typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括基本数据类型(int,char等)和自定义的数据类型(struct等),但不能创建新类型。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
比如,写一个int型的变量,我们能从名字知道它大概的含义,但我们不能知道这个变量的属性是什么。有人会说,它是int类型啊,但int类型占多少字节,不是一个确定的值。
int可能占2字节、4字节、8字节,假如这个变量用在网络数据包里,我怎么确定它的长度是一定的呢?
解决的办法是:
然后代码里一个int都不要用,都用int32_t,一旦换了平台,那么只改typedef,就可以搞定了。
当然了,我还可以这样定义:
以后我再用reg32_t的时候,我就知道它是一个硬件寄存器变量的类型,宽度是32bit大小。
有人会说宏也可以解决这样的问题。
下面是一个坑:
看上去一样吗?好像一样,但如果遇到下面的情况:
用typedef等价于
用宏等价于
用宏的话,b就不是指针类型了。
所以typedef的存在是解决一些宏定义的问题,让代码更好看。
对于网络、驱动等等关注变量类型字节宽度的地方,typedef作用很重要。并且,不知道有多少人体验过64位编程,64位C语言里,我见过的有LP64,ILP64,LLP64,大概的意思是:
为了应付各种奇葩的编译器,最好的办法是自己定义好类型,用自己的类型,当需要迁移到新平台时,改几个头文件就可以了。
这也是为什么各个操作系统都热衷于定义一套自己的类型,而不推荐直接使用C语言默认类型的原因(Windows里有DWORD,Linux里有u_int32_t)。
另外,宏也好,typedef也好,都是为了提高代码可读性,如果只是为了表现自己用了多少复杂的东西而特意用这些玩意,还是别用的好。