您的位置:首页 > 其它

typedef使用

2015-10-22 17:59 267 查看

1、利用typedef定义函数指针 

  代码简化,促进跨平台开发
  typedef行为有点类似#define 宏,用其实际类型替代同义字。
  不同点:typedef 在编译时被解释,因此让编译器来 应付超越预处理器能力的文本替换;
  用法一:
    typedef int (* func)(int, int);-----------这种用法一般用在给函数定义别名的时候;
    形式:typedef 返回值类型 (*函数别名)(参数列表)
    上面的例子定义func 是一个函数指针, 函数类型是:参数为两个int, 返回值为:int
  分析方法如下:
    先去掉typedef和别名,剩下的就是原变量的类型。
    如:int (*func)(int , int )
      char (*pFun)(int);  //定义了一个指针变量pFun,它是一个指向某种函数的指针,这种函数参数是一个int类型。
      //只有这一句我们还无法使用这个指针,因为我们还没对它进行赋值
      char glFun(int a){return ;}  //定义量一个函数glFun(),该函数正好是一个以int为参数返回char的函数,
       //我们从指针的层次上理解函数,函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址;

    int main()
    {
      pFun = glFun;
      (*pFun)(2);
      return 0;
    }

  用法二:
    typedef 给变量类型定义一个别名:
    typedef struct{
      int id;
      char name[10];
    }mystruct;
    这里把一个还未命名的结构体直接取了一个mystruct的别名。
    这样如果定义结构体的实例可以这样:
      mystruct tmp;

#include <stdio.h>
typedef int (*FP_CALC)(int, int);
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,返回值是一个函数指针,
//该函数指针类型:参数是2个int, 返回值是int
//该函数的作用是根据操作符返回对应函数的地址;
30 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;
}

//s_calc_func为函数,参数是op;
//返回值为一个拥有  两个int参数,返回类型为int的函数指针
int (*s_calc_func(char op))(int, int)
{
return calc_func(op);
}

//最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果
int calc(int a, int b, char op)
{
FP_CALC fp = calc_func(op); //根据预算得到各种运算的函数地址;
int (*sp)(int, int) = s_calc_func(op);  //用于测试;
//  ASSERT(fp = sp); //设置断言
if(fp) return fp(a, b); //根据上一步得到的函数的地址调用相应函数,并返回结果
else return -1;
}

int main()
{
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, '/'));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: