typedef

最近对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

http://developer.51cto.com/art/201104/256060.htm

http://zhidao.baidu.com/link?url=g73-2jSdX9ooU8G3QNd9ciE3xTtwx0ZDWRFpvgEYVwUil3giIkFASBfU4zP6RPc7EXL2VF4FLyyjO1m2aM3IR_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值