一直对C语言中的typedef不是搞的很明白,不是很清晰。 有些typedef的表达式很清晰,有些typedef的表达式根本让人摸不着头脑。 今天才发现,原来,我的所有的不清晰,是来源于对typedef的用法的不理解。 其中,一开始就把我引入了歧途的是下面一个最简单的例子。 typedef char* String ; 在上面的一个最简单的例子中,很多书上的解说是,给char*类型指定了一个别名String. 所以以后就可以用String a;这样的表达式来表示定义一个char*指针。 上面的说法是没有问题的,因为实际上实现的结果就是这样。 但是上面的说法很容易给初学者一个错觉,那就是,typedef的用法是这样的: typedef type alias 也就是说,typedef的用法是有两个参数,第一个参数表示需要做别名的类型,第二个参数表示的是我们所起的别名的名字!! 这是一个完全跟typedef的用法相悖的理解,但是遗憾的是,在不少的情况下,这样的错误的理解方式并不引起实质上的程序的错误!!也就是说,很多情况下,我们就这么理解,虽然理解的方式是错误的,但是结果跟正确的理解的结果并没有不同!! 如: typedef unsigned int U32; typedef struct tag { int x; int y; }Point,*Pt; 但是也有很多的typedef的用法,并不符合上述的原则,比如: typedef int Point[5]; typedef int *Func(int,int); 等等。 上面的两个typedef就不能够用一开始我们所说的方法来套。 那么怎么办呢? 只能够是强行的记下来,typedef int Point[5]的Point表示了一个有5个int类型元素的数组。 typedef int (*Func)(int,int)表示一个函数指针,也就是指向函数的指针,其中,函数的类型为int f(int,int). ... ... 以上就是我以前对typedef的理解。由于理解的方法不对,直接导致了"记不住",每次碰到复杂点的typedef都需要查书来看是什么意思。 今天才赫然发现,原来我对typedef的理解,是从语法上就错了!!!其实是个很简单的东西,被理解的一头雾水了。。。。 typedef的用法中,并没有什么两个参数之说!!而是一个整体的表达式,这是要立即纠正过来了!! typedef后面可以跟任意的表达式,如: typedef int P; typedef char* P; typedef char P[20]; typedef int (*array[5])(int,int); typedef char (*func)(char,char); typedef后面可以跟任何的申明形式,就象定一个int变量,一个char数组一样。 就象typedef char P[20];这个表达式来说,typedef后面的是一个整体,而不是两个参数,就跟写char P[20];这个表达式一样。 所不同的是: char P[20];这个表达式表明定义了一个char类型的数组,P就是这个数组的名字。 而 typedef char P[20];这个表达式则表明申明了一种数组类型 char P[20],也就是包含有20个char元素的数组,所不同的是,这里的P不代表数组的名字,P在这里是代表了一种结构,因为typedef后面的表达式其实是一种结构,我们需要进行类型转换的复杂的结构,那么用什么来代表这种结构呢?总要起个名字吧,正好,P可以恰好被拿来做这件事情(这是一件偷巧的事情),用P可以来表示一个包含了20个char元素的数组这样的结构!! 所以,如果要理解typedef的话,那么就把typedef后面的表达式看作一个整体,然后看这个表达式整体上实际是代表了一个什么东西。是一个数组?一个变量?一个结构体指针?还是一个函数? ----------------------------------------------------------------------------- 另外还有一点,让typedef看起来如此烦的是,在typedef中,有一种重点的用法,就是函数指针的用法! 使用typedef定义一个函数指针的类型是很普通的一种用法,或许这也是typedef在C语言中被引入的重要的原因(纯属猜测。。) 拿上面的一个例子来说, typedef char *Func(char,char);这样的表达式, 很明显,char (*Func)(char,char)是代表一个指向函数的指针,所以就用我们选定的alias叫做func的来代表这样的一个指针! b这也是所有typedef的特点,就是看清楚typedef后面的表达式到底是定义了一个什么东西,然后就可以用我们自己想用的叫做Func的alias来代表这个东西! /b 如上所述,那么我们就可以使用func来写出下面这样的一种方便易懂的代码了: Func abc(int a); 如上所述,上面的东西是什么东东? 冥想它是一个函数,此函数名叫做abc,参数是一个int类型,返回值是一个函数指针! 是多么的清晰阿! 但是,如果不用typedef来做的话,那么,同样的表达式就要写成下面这样子: char (*abc(int a))(char,char); 是不是很烦,是不是很不明晰?肯定的,而且让人看不懂。。。 所以可见,typedef在凡是涉及到函数指针的地方,都会起到让C代码更加清晰的作用,这可能也就是typedef对于C语言的写法的一种补充吧。 下面一例也一样。 typedef int (*array[5])(int,int); array test;
如何理解C语言中的typedef
最新推荐文章于 2023-09-05 14:26:39 发布