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; }
相关文章推荐
- CentOS7下LVS+Keepalived实现高性能高可用负载均衡
- Hadoop单机伪分布式配置
- windows7 怎么打开telnet服务
- 在SQL SERVER如何删除指定字符开头的视图
- source 1.3 中不支持泛型 解决办法
- UILabel设置多种字体、颜色 (NSMutableAttributedString)
- lamp环境下安装Zabbix环境
- java 图片读写
- 基于jQuery.i18n.properties 实现前端页面的资源国际化
- 如图实现一个textview在另一个textview的右上角
- [.Net码农]RDLC报表打印
- linux中sd卡驱动(2)
- <<JavaScript编程全解>>阅读笔记之javascript数据类型
- 总结了两种绘画透明窗体的方法,都有些缺陷,能适用一般情况
- Linux Ubuntu Nginx负载均衡 安装 配置
- 使用下拉列表框进行多选
- pushlet推送实例 转载
- Mac升级10.11后CocoaPods出问题
- 猴子吃桃问题
- 垂直门户网站和电商的SEO思路