目的:实现代码简化, 促进跨平台开发。
相似点:typedef 行为有点像 #define 宏,用其实际类型替代同义字。
不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。
用法一:
typedef int (MYFUN)(int, int);
这种用法一般用在给函数定义别名的时候,该例子定义MYFUN 是一个函数指针,函数类型是带两个int 参数, 返回一个int。在分析时可以用下面的方法:
先去掉typedef 和别名,剩下的就是原变量的类型。
去掉typedef和MYFUN以后就剩:
int ()(int, int)
用法二:typedef给变量类型定义一个别名。构造方法:typedef 原变量类型 别名
例如:
typedef struct
{
int a;
int b;
}MY_TYPE;
这里把一个未命名结构直接取了一个叫MY_TYPE的别名,这样如果想定义结构的实例的时候就可以:
MY_TYPE tmp;
补充内容:
1、typedef int (*PF) (const char *,const char *);
*/ 声明中引入了PF类型作为函数指针的同义字,该函数有两个const char * 类型的参数以及一个 int 类型的返回值 */
2、简单的函数指针的用法
// 形式1:返回类型(*函数名)(参数表)
char(*pFun)(int); //定义指针变量pFun,一个指向某种函数的指针,函数 参数是一个int类型,返回值是char类型
char glFun(int a) // 定义函数glFun(),以int为参数返回char的函数
{
return;
}
void main()
{
pFun =glFun;
(*pFun)(2);
}
// 形式2:使用typedef进行定义
typedef char(*PTRFUN)(int) // typedef的功能是定义新的类型,定义 PTRFUN的类型,并定义这种类型为指向某种函 数的指针,这种函数以一个int为参数并返回char类型
PTRFUN pFun;
char glFun(int a)
{
return;
}
void main()
{
pFun = glFun;
(*pFun)(2);
}
例子:
// 定义四个函数
int add(int, int);
int sub(int, int);
int mul(int, int);
int div(int, int);
typedef int (*FP_CALC)(int, int); // 定义指向这类函数的指针
FP_CALC calc_func(char op); // 定义一个函数calc_func,根据操作字符 op 返 回指向相应的计算函数的指针
int calc(int a, int b, char op); // 根据op返回相应的计算结果值
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return b? a / b : -1;
}
// 上面这个函数的用途与下一个函数作业和调用方式的完全相同,参数为op,而不是两个整形,只返回了一个函数指针,相当于 FP_CALC calc_func(char op)
int (*s_calc_func(char op)) (int, int)
{
return calc_func(op);
}
FP_CALC calc_func(char op)
{
switch (op)
{
case '+': return add;
case '-': return sub;
case '*': return mul;
case '/': return div;
default:
return NULL;
}
return NULL;
}
int calc(int a, int b, char op)
{
FP_CALC fp = calc_func(op);
int (*s_fp)(int, int) = s_calc_func(op); // 类似的直接定义指向函数指针变 量,不用typedef来实现指向函数的指针
ASSERT(fp == s_fp); // 可以断言这俩是相等的
if (fp)
{
return fp(a, b);
}
else
{
return -1;
}
}
void test_fun()
{
int a = 100, b = 20;
printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
}
运行结果:
calc(100, 20, +) = 120
calc(100, 20, -) = 80
calc(100, 20, *) = 2000
calc(100, 20, /) = 5