typedef void (*funcptr)();是什么怪胎
今天看C陷阱与缺陷,看到typedef的用法,很奇怪typedef void (*funcptr)();
(*(funcptr)0)();
funcptr变成了一个类型强制转换符号了。
一般用法typedef UINT8 unsigned char,前者用于替代后者
而上面的例子根本看不到前后者 typedef语法你搞错了,是后面代表前面 68336016 发表于 2013-3-4 23:48 static/image/common/back.gif
typedef语法你搞错了,是后面代表前面
哦 是的 谢谢
我发完帖子看到了 但是懒得改了
但是 没关系 帖子重点是 typedef void (*funcptr)(); 以前在什麼地方看到過,但是記不清是哪裡了。
如何使用typedef呢?從定義變量開始:
正常定義一個整形变量:int a;
加上typedef,typedef int a;那麼就是给整形定义一个别名。
void (*funcptr)(); 是声明一个函数指针,那么加上typedef就是给这个函数指针定义一个别名。
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); 你没明白我的意思
int a,a是变量名,加上typedef,a是int的别名;
void (*funcptr)(), funcptr同样只是一个变量名而已,只不过他的类型是void(*)(), 加上typedef之后,funcptr变成了这个类型的别名。
有些地方是必须要用typedef的,不用他完成不了某些任务。 定义funcptr的类型为void (*)()这样的函数指针
funcptr a1,a2,a3......
void aa(void) {...}
a1 = aa; 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; 看看函数指针 funcptr是一个函数指针,函数必须为void func()的形式。 声明函数指针就是很怪的。
如果仿照变量类型声明,声明函数指针似乎应该这样:
typedef void(*)()variable;
但是c标准的创建者没有这样做,估计怕引起歧义(没查证),所以选择:
typedef void(*variable)();
c编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable。
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
int age;
int income;
}PsInfoVar1;
是否应为:
struct PersonalInfo {
int age;
int income;
}PsInfoVar1; xizi 发表于 2013-3-5 02:10 static/image/common/back.gif
对正常结构体变量定义中出现等号表示怀疑:
struct PersonalInfo ={
int age;
你是对的谢谢提醒
总是没记准确 {:sweat:} 这是函数指针用法,经常用于回调函数或动态链接库调用
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端 学习一下.... 1、typedef 是定义新的数据类型而不是替代
2、在此funcptr已经被用户定义为一种新的数据类型,该类型是函数指针类型
3、#define 才是替代 typedef是定义了类型的别名,并没有定义新的类型! 我记得这是typedef三种典型用法之一。去网上去搜一下,很多。 函数指针{:lol:}{:lol:} 前面、后面;
里面、外面。 形式不同而已! 深深的学习了!{:smile:} 在freeMODBUS里,初始化函数里,就有这种用法。 void(*)() 这个函数指针指到那里?
http://bbs.csdn.net/topics/300212168
页:
[1]