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_

0 0
原创粉丝点击