最近对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是整型数组类型,数组长度为10
a 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