看完《C专家编程》后对typedef的使用有了更深的了解,在看了许多例子和实际使用多次后得出了一些规律,拿出来和大家分享,有不对的地方还需大家指正。
用typedef之前要先了解C语言的声明方法。
char* (*fun)(char*)
这个声明从变量名fun开始解读,先向右读是')',这时要向左读‘*’,表明fun是一个指针,然后再向右读到了‘(’,说明指针指向一个函数,继续向右读是‘char*)’,说明这个函数是以char*为参数的,然后再向左读是‘*’,表明函数返回值是指针,继续向左读‘char’,表明指针指向char,这时我们已经读完了整个变量声明,可以连起来说就是fun是一个指针,指向一个函数,这个函数以指向char的指针为参数,返回值是指针,指向char型变量。
在这个例子里我想说明的是C语言声明的解读是机械固定的,有一个由内到外的具体套路,而不是靠经验来解读的,当然有经验能一眼看出来,至于具体解读套路可以去看看《C专家编程》,我也是看了这本书才搞明白的。
下面是typedef的说明了,网上关于typedef的使用说明一大堆,讲的已经很全了,我也搜了一下,发现还有很多我也不知道的地方,所以我也不仔细讲了,我就讲一点,这一点我好想没有在网上看到过,就是typedef具体如何使用。
假如我要声明一个上面fun所属的类型该怎么办,很简单
typedef char* (*fun_type)(char*);
定义fun只要
fun_type fun;
再举一个简单的例子,我要定义一个char * 类型要怎么办,先定义一个char*类型的变量:
char* string
再把变量变成类型:
typedef char* string
所以typedef定义类型的原理很简单,先定义想要定义类型的变量,再加上typedef,变量名就成了类型名,所以我猜想编译器对typedef的类型名定义的变量的处理也许是这样的:
fun_type fun1,fun2;--------->char* (*fun1)(char*),char* (*fun2)(char*);
也就是typedef的逆过程,用变量名替代typedef定义的类型名的位置,还原到一开始的定义方法,这样一来,定义的变量就一定我们想要的类型,这么看来,typedef与#define的区别显而易见,用define定义类型名只是简单的文本黏贴,无法定义复杂的类型,而typedef可以定义任意复杂的类型,所以自定义类型时typedef是最好的选择。
以上是我的小小心得,欢迎指正。