typedef void (*funcptr)();是什么怪胎





typedef void (*funcptr)();是什么怪胎 

[复制链接]
   
跳转到指定楼层
1
  发表于 2013-3-4 23:36:39  |  只看该作者  回帖奖励
今天看C陷阱与缺陷,看到typedef的用法,很奇怪
typedef void (*funcptr)();
(*(funcptr)0)();

funcptr变成了一个类型强制转换符号了。
一般用法typedef UINT8 unsigned char,前者用于替代后者
而上面的例子根本看不到前后者
 
 
2
  发表于 2013-3-4 23:48:04  来自手机  |  只看该作者
typedef语法你搞错了,是后面代表前面
 
 
 
3
  楼主 |  发表于 2013-3-4 23:49:46  |  只看该作者
68336016 发表于 2013-3-4 23:48 
typedef语法你搞错了,是后面代表前面

哦 是的 谢谢
我发完帖子看到了 但是懒得改了
但是 没关系 帖子重点是 typedef void (*funcptr)();
 
 
 
公益广告:本论坛不得使用、宣传Q群。 有讨论请在论坛里进行。 违者将封锁ID.
4
  发表于 2013-3-5 00:07:34  |  只看该作者
 以前在什麼地方看到過,但是記不清是哪裡了。
如何使用typedef呢?從定義變量開始:
正常定義一個整形变量:int a;
加上typedef,typedef int a;那麼就是给整形定义一个别名。
void (*funcptr)(); 是声明一个函数指针,那么加上typedef就是给这个函数指针定义一个别名。
 
 
 
公益广告:发表招聘帖子需要缴费,有需要可以联系网站工作人员王小姐:13711915767.
5
  楼主 |  发表于 2013-3-5 00:13:27  |  只看该作者
lcofjp 发表于 2013-3-5 00:07 
 以前在什麼地方看到過,但是記不清是哪裡了。
如何使用typedef呢?從定義變量開始:
正常定義一個整形变 ...

但是这个别名就是functpr本身啊,而没有其它的做替代,就是没有了一般的前者后者的关系了
你看它后面定义的:(*(funcptr)0)();     //将0强制转换为函数指针,然后运行该函数,也就是地址0处的函数

呵呵 我还在看书 后面有更绝的:
typedef void (*HANDLER)(int);
HANDLER signal (int, HANDLER);
 
 
 
公益广告:广告只能发在本论坛的广告区,否则将封锁ID。
6
  发表于 2013-3-5 00:20:14  |  只看该作者
你没明白我的意思
int a,a是变量名,加上typedef,a是int的别名;
void (*funcptr)(), funcptr同样只是一个变量名而已,只不过他的类型是void(*)(), 加上typedef之后,funcptr变成了这个类型的别名。

有些地方是必须要用typedef的,不用他完成不了某些任务。
 
 
 
7
  发表于 2013-3-5 00:26:07  |  只看该作者
定义funcptr的类型为void (*)()这样的函数指针
funcptr a1,a2,a3......

void aa(void) {...}
a1 = aa;
 
 
   
8
  楼主 |  发表于 2013-3-5 00:37:57  |  只看该作者
lcofjp 发表于 2013-3-5 00:20 
你没明白我的意思
int a,a是变量名,加上typedef,a是int的别名;
void (*funcptr)(), funcptr同样只是一 ...

看懂了  哈哈
原来typedef是这么用的:
假设正常申明(or定义)变量是int variable;
那么如果在这个什么前加上typedef,即 typedef int variable;
则原本的variable则变成了一串可以代替原先申明的字符。
由于呢,申明一个函数指针本身就比较怪,variable跟其申明体是混合在一起的,所以看起来比较吃力
但其实原理一样:typedef void(*variable)();  //这么一typedef后,variable就变成替代这种定义的字符串了

我是想起了结构体的typedef用法才理解的:
typedef struct PersonalInfo ={
      int age;
      int income;
}PsInfoDef;
而正常结构体变量是这么定义的:
struct PersonalInfo ={
      int age;
      int income;
}PsInfoVar1;
 
 
   
9
  发表于 2013-3-5 01:01:04  来自手机  |  只看该作者
看看函数指针
 
 
   
头像被屏蔽
10
  发表于 2013-3-5 01:12:51  |  只看该作者
提示:  作者被禁止或删除 内容自动屏蔽
 
 
   
11
  发表于 2013-3-5 02:04:37  |  只看该作者
声明函数指针就是很怪的。
如果仿照变量类型声明,声明函数指针似乎应该这样:
typedef void(*)()  variable;  
但是c标准的创建者没有这样做,估计怕引起歧义(没查证),所以选择:
typedef void(*variable)(); 
c编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable。
 
 
   
12
  发表于 2013-3-5 02:10:35  |  只看该作者
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
      int age;
      int income;
}PsInfoVar1;
是否应为:
struct PersonalInfo {
      int age;
      int income;
}PsInfoVar1;
 
 
   
13
  楼主 |  发表于 2013-3-5 11:58:13  |  只看该作者
xizi 发表于 2013-3-5 02:10 
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
      int age;

你是对的  谢谢提醒
总是没记准确   
 
 
   
14
  发表于 2013-3-5 12:12:27  来自手机  |  只看该作者
这是函数指针用法,经常用于回调函数或动态链接库调用
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端
 
 
   
15
  发表于 2013-3-7 10:17:17  来自手机  |  只看该作者
学习一下....
 
 
   
16
  发表于 2013-3-9 15:32:45  |  只看该作者
1、typedef 是定义新的数据类型而不是替代
2、在此funcptr已经被用户定义为一种新的数据类型,该类型是函数指针类型
3、#define 才是替代
 
 
   
17
  发表于 2013-3-9 15:38:42  来自手机  |  只看该作者
typedef是定义了类型的别名,并没有定义新的类型!
 
 
   
18
  发表于 2013-3-9 16:51:45  |  只看该作者
我记得这是typedef三种典型用法之一。去网上去搜一下,很多。
 
 
   
19
  发表于 2013-4-25 17:02:11  |  只看该作者
函数指针  
 
 
   
20
  发表于 2013-4-25 17:12:23  |  只看该作者
前面、后面;
里面、外面。     形式不同而已!






































解释:typedef void (*Fun) (void)  

2013-08-28 12:56:47|  分类: C和C++学习|举报|字号 订阅

int   i; 
定义了一个int类型的变量i; 
而这样 
typedef   INT   int; 
表示用户自己定义了一个整型数据类型INT,实际上就等同于int 
所以:INT   ii; 
同上,表示定义了一个int类型的变量ii; 
同样的: 
void   (*pFn)(void)   
定义了一个函数指针,该函数指针指向   类似于   void   Foo(void)函数的函数入口地址 
而这样: 
typedef   void   (*Fun)(void) 
表示用户自己定义了一个函数指针数据类型 
而 
Fun   pf; 
表示定义了一个函数指针pf,改函数指针指向类似于void   *pf(void)的函数  //leo 

char *a="This is ";//这个在常量区分配一个空间,然后a指向此空间
char a[] = "This is"//这个在常量区分配一个空间,然后又在栈上分配一个空间,将常量区的内容复制过来,所以可以修改


定义一个函数指针类型。
比如你有三个函数:
void hello(void) { printf("你好!"); }
void bye(void) { printf("再见!"); }
void ok(void) { printf("好的!"); }

typdef void (*funcptr)(void);
这样就构造了一个通用的函数
你用的时候可以这样:
void speak(int id)
{
   funcptr words[3] = {&hello, &bye, &ok};
   funcptr fun = words[id];
   (*fun)();
}

这样的话,如果speak(0)就会显示“你好!”
speak(1)就会显示“再见!”
speak(2)就会显示“好的!”

用于处理参数和返回值的形式都一样,但是功能不确定的一组函数,可以使用函数指针。

比如算术运算符,加、减、乘、除,都可以用typedef int (*calc)(int,int)代表,等等



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值