搜索
bottom↓
回复: 23

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

[复制链接]

出200入657汤圆

发表于 2013-3-4 23:36:39 | 显示全部楼层 |阅读模式
今天看C陷阱与缺陷,看到typedef的用法,很奇怪
typedef void (*funcptr)();
(*(funcptr)0)();

funcptr变成了一个类型强制转换符号了。
一般用法typedef UINT8 unsigned char,前者用于替代后者
而上面的例子根本看不到前后者

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出130入129汤圆

发表于 2013-3-4 23:48:04 来自手机 | 显示全部楼层
typedef语法你搞错了,是后面代表前面

出200入657汤圆

 楼主| 发表于 2013-3-4 23:49:46 | 显示全部楼层
68336016 发表于 2013-3-4 23:48
typedef语法你搞错了,是后面代表前面

哦 是的 谢谢
我发完帖子看到了 但是懒得改了
但是 没关系 帖子重点是 typedef void (*funcptr)();

出0入0汤圆

发表于 2013-3-5 00:07:34 | 显示全部楼层
 以前在什麼地方看到過,但是記不清是哪裡了。
如何使用typedef呢?從定義變量開始:
正常定義一個整形变量:int a;
加上typedef,typedef int a;那麼就是给整形定义一个别名。
void (*funcptr)(); 是声明一个函数指针,那么加上typedef就是给这个函数指针定义一个别名。

出200入657汤圆

 楼主| 发表于 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);

出0入0汤圆

发表于 2013-3-5 00:20:14 | 显示全部楼层
你没明白我的意思
int a,a是变量名,加上typedef,a是int的别名;
void (*funcptr)(), funcptr同样只是一个变量名而已,只不过他的类型是void(*)(), 加上typedef之后,funcptr变成了这个类型的别名。

有些地方是必须要用typedef的,不用他完成不了某些任务。

出215入169汤圆

发表于 2013-3-5 00:26:07 | 显示全部楼层
定义funcptr的类型为void (*)()这样的函数指针
funcptr a1,a2,a3......

void aa(void) {...}
a1 = aa;

出200入657汤圆

 楼主| 发表于 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;

出0入0汤圆

发表于 2013-3-5 01:01:04 来自手机 | 显示全部楼层
看看函数指针

出0入0汤圆

发表于 2013-3-5 01:12:51 | 显示全部楼层
funcptr是一个函数指针,函数必须为void func()的形式。

出0入0汤圆

发表于 2013-3-5 02:04:37 | 显示全部楼层
声明函数指针就是很怪的。
如果仿照变量类型声明,声明函数指针似乎应该这样:
typedef void(*)()  variable;  
但是c标准的创建者没有这样做,估计怕引起歧义(没查证),所以选择:
typedef void(*variable)();
c编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable。

出0入0汤圆

发表于 2013-3-5 02:10:35 | 显示全部楼层
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
      int age;
      int income;
}PsInfoVar1;
是否应为:
struct PersonalInfo {
      int age;
      int income;
}PsInfoVar1;

出200入657汤圆

 楼主| 发表于 2013-3-5 11:58:13 | 显示全部楼层
xizi 发表于 2013-3-5 02:10
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
      int age;

你是对的  谢谢提醒
总是没记准确   

出0入0汤圆

发表于 2013-3-5 12:12:27 来自手机 | 显示全部楼层
这是函数指针用法,经常用于回调函数或动态链接库调用
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端

出0入0汤圆

发表于 2013-3-7 10:17:17 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-3-9 15:32:45 | 显示全部楼层
1、typedef 是定义新的数据类型而不是替代
2、在此funcptr已经被用户定义为一种新的数据类型,该类型是函数指针类型
3、#define 才是替代

出0入0汤圆

发表于 2013-3-9 15:38:42 来自手机 | 显示全部楼层
typedef是定义了类型的别名,并没有定义新的类型!

出0入0汤圆

发表于 2013-3-9 16:51:45 | 显示全部楼层
我记得这是typedef三种典型用法之一。去网上去搜一下,很多。

出0入0汤圆

发表于 2013-4-25 17:02:11 | 显示全部楼层
函数指针  

出0入4汤圆

发表于 2013-4-25 17:12:23 | 显示全部楼层
前面、后面;
里面、外面。     形式不同而已!

出0入0汤圆

发表于 2014-6-4 11:19:03 | 显示全部楼层
深深的学习了!

出0入0汤圆

发表于 2014-6-4 11:34:09 | 显示全部楼层
在freeMODBUS里,初始化函数里,就有这种用法。

出0入0汤圆

发表于 2014-11-12 21:48:16 | 显示全部楼层
void(*)()    这个函数指针指到那里?

出0入0汤圆

发表于 2014-11-12 22:01:20 | 显示全部楼层
http://bbs.csdn.net/topics/300212168
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 05:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表