在说明typedef之前我们先来对比一下typedef和define,我么知道typedef的目的是为了定义自定义类型而设计的,
而define则是预处理指令。他们的起作用的时机也是不一样的,如下图,define在预处理阶段就已经发挥作用,把定义的变量进行了机械的替换操作,而typedef到编译的时候才发挥作用
下面看个例子
#define MAXVAL 32767 //在预处理阶段,程序中使用到MAX的地方会被机械的替换成32767
typedef unsigned char uchar; //原来我们是没有uchar类型的,通过typedef我自定义了一个uchar类型让他代表unsigned char
通过简单的比较应该可以很好的分辨define和typedef的用途了,但是typedef还有很多巧妙的用法,这里给大家列举几个比较常用的
1.自定义变量类型(最常用)
typedef unsigned char uchar; //不要忘记后面的;哦,typedef和define这一点一是不同的
uchar uVal; //等价于 unsigned char uVal;
2.自定义指针类型(经常用)
typedef char* point;
piont cp; //等价于 char *cp;
3.自定义数组类型
typedef int Array[10];
typedef int Array_dim2[10][20];
Array array1; //等价于 int array[10]
Array_dim2 array2;//等价于 int array[10][20];
4.自定义函数类型
typedef int func();
func f; //等价于 int f();
5.自定义函数指针类型
typedef int (*func)();
func pf; //等价于 int (*pf)()
这里如果不太明白可以看我的之前写的函数指针和指针函数
这里给出内核启动的一段经典代码
typedef void (*lpFunction) ( ); /* 定义一个无参数、无返回类型的函数指针类型*/
lpFunction lpReset = (lpFunction)0xF000FFF0; /* 定义一个函数指针,指向CPU 启动后所执行第一条指令的位置 */
lpReset(); /* 调用函数 */
6.自定义结构体类型
typedef struct Node{
int elem[MAXVAL];
int last;
}sqlist;
sqlist head; //等价于struct Node head;
来段代码看看
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned char uchar;
typedef int Array[10];
typedef int* point;
typedef int func(void);
typedef int (*f)();
int function(void)
{
printf("Im ff!\n");
return 0;
}
int main()
{
Array array;
point p;
func *fp1=function;
fp1();
f fp2 = function;
fp2();
printf("sizeof a = %ld \n",sizeof(array));
}
结果
Im ff!
Im ff!
sizeof a = 40
最后说一下看复杂的typedef的技巧
1.未知名字为定义类型,类型为取出名称和typedef的所有部分
2.定义一个变量时,变量类型等价于把变量替代未知名字的位置所得到的类型
typedef int (*func)(); //func 等价于 int (*)()
func pf; //pf 等价于 int (*pf)()