在c和c++编程语言中,typedef是一个关键字。它用来对一个数据类型取一个别名,目的是为了是源代码更易于阅读和理解。
它通常用于简化声明复杂的类型组成的结构
例如:创建Length作为int的别名:
typedef int Length;
创建PFI作为一个指向“一个拥有两个char*当作参数并回传int的函数”的指针的别名
typedef int (*PFI)(char*, char*);
另一个例子:
int coxes;
int jaffa;
//...
//coxes++;
//...
if (jaffa == 10)
//...
现在来看以下代码
typedef int Apple;
typedef int Orange;
Apple coxes; 一个变量包含关于苹果的信息
Orange jaffa; 一个包含关于橘子的信息
//...
//coxes++;
//...
if (jaffa == 10)
//...
第二个例子用了typedef,使其更易于理解将要进行什么。也就是一个变量包含关于苹果的信息,而另一个包含关于橘子的信息。
简化声明语法
struct var{
int data1;
char data2;
};
定义了一个数据类型var
c++
声明一个var类型的变量,如 struct var a;
注意,在c++中声明一个struct时,同时也隐含了typedef,C则没有。
c
而c必须要:typedef struct var newtype;
现在要创建类型var的变量时,代码可以写为: newtype a;
这样就更容易阅读了,因为不用再为每一个var类型的变量加上关键字struct
与数组一起使用
typedef char array_t[6]; // char[6]类型的变量,别名为array_t
array_t ary = {0,1,2,3,4,5}; //<=> char ary[6] = {0,1,2,3,4,5}
数组指针
array_t *pArr; <=> char (*pArr)[6] //表示pArr是一个指向了存储char[6]类型存储器的指针
//在这里,array_t是一个char[6]的别称
与指针一起使用
typedef int *intptr;
intptr numr,id;
与结构指针一起使用
struct var{
int data1;
char data2;
};
typedef struct var per;
per *ptr_1
//<=> typedef定义了一个var*类型,apoint_var是一个指向“一个var类型”的指针
typedef struct var* apoint_var;
apoint_var var_apoint1, var_apoint2, var_apoint3;
与函数指针一起使用
int do_math(float arg1, int arg2) {
return arg2;
}
int call_a_func(int (*call_this)(float, int)) {
int output = call_this(5.5, 7);
return output;
}
int final_result = call_a_func(&do_math)
使用typedef定义
typedef int (*MathFunc)(float, int);
int do_math(float arg1, int arg2) {
return arg2;
}
int call_a_func(MathFunc call_this) {
int output = call_this(5.5, 7);
return output;
}
int final_result = call_a_func(&do_math);
用来类型转换
typedef同时可以用来类型转换 ,例如:
typedef int (*funcptr)(double);
funcptr指向一个“以一个double类型参数并返回int型的(类型转换)函数”的指针
左侧,funcptr用来声明变量;右侧,funcptr则用来转换值的类型。