ziruo2002ab 发表于 2013-3-4 23:36:39

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

今天看C陷阱与缺陷,看到typedef的用法,很奇怪
typedef void (*funcptr)();
(*(funcptr)0)();

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

68336016 发表于 2013-3-4 23:48:04

typedef语法你搞错了,是后面代表前面

ziruo2002ab 发表于 2013-3-4 23:49:46

68336016 发表于 2013-3-4 23:48 static/image/common/back.gif
typedef语法你搞错了,是后面代表前面

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

lcofjp 发表于 2013-3-5 00:07:34

 以前在什麼地方看到過,但是記不清是哪裡了。
如何使用typedef呢?從定義變量開始:
正常定義一個整形变量:int a;
加上typedef,typedef int a;那麼就是给整形定义一个别名。
void (*funcptr)(); 是声明一个函数指针,那么加上typedef就是给这个函数指针定义一个别名。

ziruo2002ab 发表于 2013-3-5 00:13:27

lcofjp 发表于 2013-3-5 00:07 static/image/common/back.gif
 以前在什麼地方看到過,但是記不清是哪裡了。
如何使用typedef呢?從定義變量開始:
正常定義一個整形变 ...

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

呵呵 我还在看书 后面有更绝的:
typedef void (*HANDLER)(int);
HANDLER signal (int, HANDLER);

lcofjp 发表于 2013-3-5 00:20:14

你没明白我的意思
int a,a是变量名,加上typedef,a是int的别名;
void (*funcptr)(), funcptr同样只是一个变量名而已,只不过他的类型是void(*)(), 加上typedef之后,funcptr变成了这个类型的别名。

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

monkeynav 发表于 2013-3-5 00:26:07

定义funcptr的类型为void (*)()这样的函数指针
funcptr a1,a2,a3......

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

ziruo2002ab 发表于 2013-3-5 00:37:57

lcofjp 发表于 2013-3-5 00:20 static/image/common/back.gif
你没明白我的意思
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;

kanprin 发表于 2013-3-5 01:01:04

看看函数指针

luoyiming1984 发表于 2013-3-5 01:12:51

funcptr是一个函数指针,函数必须为void func()的形式。

xizi 发表于 2013-3-5 02:04:37

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

xizi 发表于 2013-3-5 02:10:35

对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
      int age;
      int income;
}PsInfoVar1;
是否应为:
struct PersonalInfo {
      int age;
      int income;
}PsInfoVar1;

ziruo2002ab 发表于 2013-3-5 11:58:13

xizi 发表于 2013-3-5 02:10 static/image/common/back.gif
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
      int age;


你是对的谢谢提醒
总是没记准确 {:sweat:}

qspy 发表于 2013-3-5 12:12:27

这是函数指针用法,经常用于回调函数或动态链接库调用
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端

jz701209李 发表于 2013-3-7 10:17:17

学习一下....

yang_shangbin 发表于 2013-3-9 15:32:45

1、typedef 是定义新的数据类型而不是替代
2、在此funcptr已经被用户定义为一种新的数据类型,该类型是函数指针类型
3、#define 才是替代

nicksean 发表于 2013-3-9 15:38:42

typedef是定义了类型的别名,并没有定义新的类型!

derive3000 发表于 2013-3-9 16:51:45

我记得这是typedef三种典型用法之一。去网上去搜一下,很多。

Making 发表于 2013-4-25 17:02:11

函数指针{:lol:}{:lol:}

sunliezhi 发表于 2013-4-25 17:12:23

前面、后面;
里面、外面。   形式不同而已!

Nole 发表于 2014-6-4 11:19:03

深深的学习了!{:smile:}

cdh 发表于 2014-6-4 11:34:09

在freeMODBUS里,初始化函数里,就有这种用法。

xiay123 发表于 2014-11-12 21:48:16

void(*)()    这个函数指针指到那里?

xiay123 发表于 2014-11-12 22:01:20

http://bbs.csdn.net/topics/300212168
页: [1]
查看完整版本: typedef void (*funcptr)();是什么怪胎