关于C语言的typedef
注:本文的内容只是对自己学习到知识的一些简单总结,并没有考证过C的规范和手册进行求证。
很多文章,甚至于很多教材,对c语言的typedef的解释是有错误的,以致于许多学习C语言的人对typedef的理解往往有偏差。
一种最常见的错误观点是typedef定义了现有类型的一个别名(alias),比如
typedef int EType;/* (1) */
是给int类型取了一个EType的别名。在这种情况下,似乎也能解释的通,但是,如果碰到这样一个typedef定义呢:
typedef int (*f)(double,int); /* (2) */
观其名,识其行,看typedef的名字就明白它的意思是定义类型。typedef不是简单的给现有类型取一个别名,或者简单的进行字符替换,typedef是利用现有的数据类型类定义一个新的类型。比如语句(1),从概念上我们应当认为是定义了一种新的数据类型,只是这种新类型跟int类型是吻合的。而语句(2)定义了一种新的类型f,f这种类型是一个参数为double,int,返回值是int的函数指针类型。
那么如何去分析,识别typedef定义的类型呢?我从Tony Bai的文章中学到了蛮好的方法。方法就是看看去掉typedef之后,剩下的语句中把相应的变量(记为p)变成了什么类型,那么加上typedef之后,这个p就成了这种类型的名字。
举语句(2)的例子,把typedef去掉,原句就成了
int (*f)(double,int); /* (3) */
,这是一个很普通的函数指针的定义,这个时候f就是指向一个参数为double,int返回值为int的函数指针变量,那么加上typedef之后,f就是指向…..的函数指针类型。
再举一个通俗的例子,将语句(1)的typedef去掉,就成了
int EType;/* (4) */
我们可以清楚的看到,EType是一个int类型的变量,那么加上typedef,EType实际上就成了一个int类型。






6 个评论 关于 “关于C语言的typedef”
By KingsamChen on Sep 1, 2008 |
M$在MFC里用typedef定义了一堆新类型。
而typedef和#define的区别在应用const指针的时候体现的更加明显~
陈炬 回复说:
September 1st, 2008 at 10:32 am
哈,跟我一样的英文名和姓~
陈炬 回复说:
September 1st, 2008 at 9:08 pm
ps: typedef 跟 #define 是完全不同的两个东西,相互之间本就没有多大的联系。
By 1moJim on Sep 5, 2008 |
最近上学了难得来看看不好意思啊
不错不错,收藏了
陈炬 回复说:
September 6th, 2008 at 12:19 pm
看到你转载了,不过似乎代码部分乱掉了。
1moJim 回复说:
September 7th, 2008 at 7:38 am
直接拷了下竟然没注意到粗心了
订正了…