typedef
来源:互联网 发布:美联储资产负债表数据 编辑:程序博客网 时间:2024/06/03 13:01
最近对typedef void (*funcptr)(void) 不太理解,以前遇到的都是 typedef int IINT 这种类型的,后来明白了,funcptr 是一个函数指针他是 void (*)(void) 的别名,typedef 不是新定义了一种类型,而是给该类型取了个别名。
typedef void(*)(void) funcptr 这种定义方式编译器不识别,typedef void (*funcptr)(void) 才是正确的,估计是c标准的创建者怕引起歧义。
#include <iostream>using namespace std;#include <cstdio>#include <cstdlib>typedef void (*funcptr)(void);void hello(void) { printf("你好!\n"); }void bye(void) { printf("再见!\n"); }void ok(void) { printf("好的!\n"); }void speak(int id){ funcptr words[3] = {hello, bye, ok}; //funcptr words[3] = {&hello, &bye, &ok}; /* 这种写法也可以 */ funcptr fun = words[id]; (*fun)(); (fun)(); /* 这种也可以 函数名就是函数地址 */ }int main(){ speak(0); system("pause");}
typedef 对struct取别名也是这样:见下面实例:
#include <iostream>using namespace std;#include <cstdio>#include <cstdlib>typedef void (*funcptr)(void);typedef struct { int s; }mg;void aa(void) {}int main(){ funcptr a1,a2,a3; mg t; printf("%d\n",aa == &aa); printf("%d\n",t.s); a1 = &aa; system("pause");}
关于 typedef和define的详细区别
http://developer.51cto.com/art/201104/256060.htm 已经总结的很好,我在概括一下:
1. 二者执行时间不同.typedef 在编译阶段有效,因此typedef有类型检查的功能.define则是宏定义,发生在预处理阶段,也就是编译之前,它只是简单地字符串替换,而不进行任何检查。
2.功能不同.typedef用于定义类型的别名如
typedef int a[10];//表示a是整型数组类型,数组长度为10a s1,s2;//完全等效于:int s1[10],s2[10] ;
而define 不只是可以为类型取别名,还可以定义常量、变量、编译开关.
3.作用域不同
#define 没有作用域的限制,只是之前预定义过的宏.而typedef有自己的作用域
4.对指针的操作
Typedef int * pint; #define PINT int * Const pint p;//p不可更改,p指向的内容可以更改,相当于 int * const p; Const PINT p;//p可以更改,p指向的内容不能更改,相当于 const int *p;或 int const *p; pint s1, s2; //s1和s2都是int型指针 PINT s3, s4; //相当于int * s3,s4;只有一个是指针
5. typedef 末尾有个分号,define 没有
参考:
http://www.amobbs.com/thread-5521998-1-1.html
http://developer.51cto.com/art/201104/256060.htm
http://zhidao.baidu.com/link?url=g73-2jSdX9ooU8G3QNd9ciE3xTtwx0ZDWRFpvgEYVwUil3giIkFASBfU4zP6RPc7EXL2VF4FLyyjO1m2aM3IR_
- typedef
- typedef
- typedef
- typedef
- typedef- -
- typedef
- typedef
- typedef
- typedef
- typedef
- Typedef
- typedef
- typedef
- typedef
- typedef
- typedef
- typedef
- typedef
- hdu 1042
- 字符串子集合
- v4l2 video设备支持功能查询
- <转>extern的详解
- ENetwork Chapter 3 - CCNA Exploration (Version 4.0)
- typedef
- 环境表
- HDU 4593 Robot
- QT重装后出现的问题
- Linux是什么?
- Android开发ListView之BaseExpandableListAdapter
- 笑傲面试和简历编写
- ZOJ 3600 Taxi Fare
- Nginx