• 全部
  • 问答

关于C函数指针类型转换,请教各位大侠!

heitu0773 2007-09-04 06:00:00

我现在手头有这么一个C文件:

typedef void (*PsExtPeerFuncPtr) (void *, int, void *);
typedef void (*PsFuncPtr) (void *);

PsExtPeerFuncPtr Func1;
PsFuncPtr Func2;

如下转换是否存在问题:
Func1 = (PsExtPeerFuncPtr *)Func2;
(*Func1 ) (a,b, c);

这里略写Func2的实体

Func1函数有3个参数,Func2只有一个参数,那么a、b、c三个参数如何传到Func2中?
...全文
415 点赞 收藏 18
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Arthur_ 2007-12-07
cr?
回复
heitu0773 2007-12-07
我在一家小公司工作,抓狂中,谢谢lddLinan 您的回复
回复
zhji09 2007-09-06
学习,在实践中还没有接触过,
但是,设计到硬件平台了,就还是有可能是对的,
就看硬件方面怎么处理这个问题了,
前一段时间,我公司一个工程师郁闷的要死,
ARM7.0的吧,Keil
怎么组合的不知道,我不设计硬件平台,
他告诉我说从32位的转换到64位,打印出来就是错的%f
然后,我告诉他说用%lf,也是错的多出来6个0,
再后来才知道,其实那6个0,是小数位i,至于采用什么方式打印才会显示出那个小数点,后来的事情,没有参与了
回复
perennial_xulin 2007-09-06
cceczjxy()说得对,忽略掉了。
回复
xiaciping 2007-09-06
应该是后面两个参数被忽略掉了.
回复
heitu0773 2007-09-06
这是手机MTK平台里面的一个文件,编译通过是没有问题,而且运行也不存在问题!
上面几位大侠说,忽略掉的意思是说,后面几个参数被忽略了,是吗?
回复
zhji09 2007-09-06
看楼上的,又学到了一点
谢谢
回复
lddLinan 2007-09-06
heitu0773 () 是在那里工作的啊?现在MTK平台这么流行都讨论到论坛上来了,哈哈

MTK用arm的芯片,arm的ATPCS标准规定函数传递的前四个机器参数放在寄存器里,剩下的按顺序压栈,所以你发的代码不会出问题。不过这样很不好。

回复
cceczjxy 2007-09-05
忽略掉了
回复
ynZhen 2007-09-05
编译不会通过的
回复
Treazy 2007-09-05
这个问题没有什么意义哦!
回复
边城狂人 2007-09-04
严重不行……你为什么要这样干呢?
如果你实在想这么干,你不如写个函数包一下:

void warp(void* a, int b, void* c) {
Func2(a);
// 把 b和c丢掉了
}
回复
lddLinan 2007-09-04
有些系统的函数调用标准不是采用压栈的方式来传递参数的,而是尽可能使用寄存器,arm的ATPCS就是这样的
回复
jxlczjp77 2007-09-04
(*Func1 ) (a,b, c);这样执行后函数堆栈就不平衡了,压入了3个参数,但却没有被弹出来
回复
ysuliu 2007-09-04
为什么要这么做呢,我觉得应该不行吧。。
学习中。。。
回复
ouyh12345 2007-09-04
参数不同,不能强制转换吧
回复
lddLinan 2007-09-04
问题很严重
回复
忽略掉了
func2只接收到1个参数
其实可以从栈中取到参数的。
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2007-09-04 06:00
社区公告
暂无公告