typedef使用
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:-;
} //定义一个函数,参数是op,返回值是一个函数指针,
//该函数指针类型:参数是2个int, 返回值是int
//该函数的作用是根据操作符返回对应函数的地址;
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 -;
} int main()
{
int 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, '*'));
printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
return ;
}
typedef使用的更多相关文章
- 19-typedef
本文目录 一.typedef作用简介 二.typedef与指针 三.typedef与结构体 三.typedef与指向结构体的指针 四.typedef与枚举类型 五.typedef与指向函数的指针 六. ...
- #define与typedef在重定义类型中的区别
#define 为完全的替换 typedef 重新定一个数据类型 eg #define charp1 char* typedef char* charp2charp1 a,b; //a char* b ...
- typedef
第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...
- 用typedef定义函数指针的问题
在学习windows API的时候,遇到下面这段代码 以前见过的typedef的用法都是给一个数据类型取一个别名 typedef oldTypeName newTypeName 这种给数据类型 ...
- C语言语法 typedef小结
在总结typedef之前,先了解一个专业术语: 常量指针(const pointer):常量指针在定义的时候必须被初始化,而且一旦初始化完成,则它的值就不能再改变. int errNumb = 0; ...
- 如何理解typedef void (*pfun)(void)
问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...
- C及C++中typedef的简单使用指南
又是在学数据结构的时候,发现了之前学习的知识遗忘很多,在发现对C/C++中关键字typedef的理解还是没有到位后,我翻阅了学C++用到的课本,又问了度娘,也看了不少关于typedef用法的博客.于是 ...
- [转]关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些 ...
- typedef 和 #define 的区别
本文已迁移至: http://www.danfengcao.info/c/c++/2014/02/25/difference-between-define-and-typedef.html typed ...
- [转载]彻底弄清struct和typedef struct
struct和typedef struct 分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int ...
随机推荐
- linux下/proc/sysrq-trigger文件的功能
/proc/sysrq-trigger该文件能做些什么事情呢? # 立即重新启动计算机 (Reboots the kernel without first unmounting file system ...
- linux下gmplayer安装(亲测OK!)
需要的安装包及下载地址: mplayer源代码包(MPlayer-1.0rc4.tar.bz2)下载:http://www.mplayerhq.hu/MPlayer/releases/ 解码器安装包 ...
- vim note
2016-1-22 vim plugin collections: (参考 https://www.youtube.com/watch?v=0QFR-_wUoA0) vim-pathogen 插件管 ...
- ODI KM二次开发手册
ODI KM二次开发手册 分类: ODI(16) 目录(?)[+] 1 引言 1.1 编写目的 本手册面向的读者对象为具备数据集成业务知识及对ODI操作了解的开发人员,作为其完成基于ODI基础上K ...
- mini KMS Activator v1.3破解激活microsoft Office 2010 RTM
利用mini KMS Activator v1.3破解激活microsoft Office 2010 RTM方法,只是为体验office而做测试使用的哦...大家觉得好就自觉购买正版去... 使用步骤 ...
- Android程序的入口点
原文:Android程序的入口点 android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码 ...
- 【POJ】2492 A bug's life ——种类并查集
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28211 Accepted: 9177 De ...
- 利用sass构建组件化的ui库
创建公用的Sass项目模板 在做项目时,不管什么项目,他们之间总是有一些可以共用的部分.比如说重置样式.公用样式.模块组件.UI库等.那么在Sass项目中也是如此.为了避免在每个项目中做一些相同的事情 ...
- Delphi XE7中新并行库
Delphi XE7中添加了新的并行库,和.NET的Task和Parellel相似度99%. 详细内容能够看以下的文章: http://www.delphifeeds.com/go/s/119574 ...
- C语言的复合文字
假设需要向一个带有int型参量的函数传递一个值,这时可以传递一个int型常量,也可以传递一个int型的变量.在C99标准之前,数组参数情况于现在不一样,没有所谓的数组常量可供传递,而在C99中增加了复 ...