高手进来,简单的函数指针问题,UP有分

asett1 2009-04-03 10:19:35
我觉得是怪异的diab C++编译器(不是MS, GCC的编译器)问题,也许高手看来不是。
看看怎么修改代码来 对付这个怪异的编译器?

如下代码,总是把函数入口指针解析为 void (*)() 而不是 void *

long IsrAddHandler(unsigned long vector, void *handler, void *arg);

void (*isr_ptr)(void);
extern "C" unsigned long GPIO_interrupt_test(unsigned long)
{
isr_ptr = GPIO_interrupt_isr;

IsrAddHandler(V_PC6,isr_ptr,0);
}


"src/afe.cc", line 181: error (etoa:4167): argument of type "void (*)()" is
incompatible with parameter of type "void *"
IsrAddHandler(V_PC6,isr_ptr,0);
^



...全文
373 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
ypb362148418 2009-04-07
  • 打赏
  • 举报
回复
函数指针就是那样用的 啊,不把函数转化为*类型的,咋作为指针用呢?建议看看函数指针和《C与指针》
MoonAndWind 2009-04-07
  • 打赏
  • 举报
回复
友情UP
asett1 2009-04-07
  • 打赏
  • 举报
回复
bao001001, 这个dcc 不吃这一套,不能转换
line 157: error (etoa:4171): invalid type conversion
IsrAddHandler(vector, (void*)handler, arg);

jiefangtw, 没办法把void*强制类型转换,除非看看dcc有什么编译选项,有何高招?
vip__888 2009-04-07
  • 打赏
  • 举报
回复
up!
tsoslience 2009-04-07
  • 打赏
  • 举报
回复
帮忙顶吧
solaker 2009-04-07
  • 打赏
  • 举报
回复
帮顶
snthenry 2009-04-07
  • 打赏
  • 举报
回复
不是很明白,up,关注ing
jn989 2009-04-03
  • 打赏
  • 举报
回复
up!
等待高手进一步解答
asett1 2009-04-03
  • 打赏
  • 举报
回复
void GPIO_interrupt_isr()
{
...
}

我觉得C编译器不严格,导致C里面IsrAddHandler() 参数传递没问题,但在C++里不行啦。
asett1 2009-04-03
  • 打赏
  • 举报
回复
void GPIO_interrupt_isr()
{
...
}

我觉得C编译器不严格,导致C里面IsrAddHandler() 参数传递没问题,但在C++里不行啦。
  • 打赏
  • 举报
回复
void (*isr_ptr)(void);
extern "C" unsigned long GPIO_interrupt_test(unsigned long)
{
isr_ptr = GPIO_interrupt_isr;

IsrAddHandler(V_PC6,isr_ptr,0);
}

GPIO_interrupt_isr是什么?

是void fun(void)型的函数吗?
asett1 2009-04-03
  • 打赏
  • 举报
回复
这个 IsrAddHandler()是C库的函数,不是我们写的,它用C编译器通过的,在C代码里都是正常使用的,但是在C++编译器里无法通过,现在也不能更改IsrAddHandler()的实现,更改声明也无法link通过。
还有其他办法吗?
ztenv 2009-04-03
  • 打赏
  • 举报
回复
void *handler明显的和这个不匹配嘛,怎么改楼上已经有人说了;
建议看看函数指针
liliangbao 2009-04-03
  • 打赏
  • 举报
回复
IsrAddHandler(V_PC6,isr_ptr,0);
中你将函数指针isr_ptr,赋予了void*类型的指针,出问题了!
可以修改:
IsrAddHandler(V_PC6,(void*)isr_ptr,0)
{
void (*q)(void);
q = (void (*)(void))isr_ptr;
.....
}
Proteas 2009-04-03
  • 打赏
  • 举报
回复
支持 2 楼。
从来没把函数指针用 void* 传。
asett1 2009-04-03
  • 打赏
  • 举报
回复
这样改了声明,在link时依旧报错,请问应如何改?这样跟lib的.h是不一样的,lib实现在link时依旧会报错。

dld: warning: Undefined symbol in file 'bsd.o(../../../ipdev/ES1/drv/bsd/es1pq2/libBSD.a)':
IsrAddHandler__FUlPFv_vPv
IsrAddHandler(unsigned long, void (*)(void), void *)
dld: Undefined symbols found - no output written
mengde007 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lightnut 的回复:]
long IsrAddHandler(unsigned long vector, void *handler, void *arg);
=====>
long IsrAddHandler(unsigned long vector, void (*handler)(), void *arg);

[/Quote]的
asett1 2009-04-03
  • 打赏
  • 举报
回复
强制类型转换是不行的,编译器依旧报错,就问问改声明会不会影响真正的调用?
asett1 2009-04-03
  • 打赏
  • 举报
回复
这个行不行啊,这个是C库的函数,我
extern long IsrAddHandler(unsigned long vector, void (*handler)(), void *arg);
了一把,编译过了,会不会使用出问题呢?
谢谢!
xiehui3651 2009-04-03
  • 打赏
  • 举报
回复
可以如楼上修改,也可以强制类型转换
加载更多回复(28)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧