【请教】一个回调函数(函数指针)的简单问题

icy_tear 2010-01-19 10:44:47
初步接触回调函数,对其用法不是特别理解,请教各位大虾,主要是带参数的回调:

第一种:

/*第一种回调注册函数*/
int CallReg1(int a, int b, int (*pFunc)())
{
return pFunc(a, b);
}


/*第二种回调注册函数*/
int CallReg2(int a, int b, int (*pFunc)(int, int))
{
return pFunc(a, b);
}

int Sum(int a, int b)
{
return (a + b);
}

int main();
{
CallReg1(1, 2, Sum);
CallReg2(1, 2, Sum);

return 0;
}

这两种方式只是回调函数指针的参数个数不一致,但编译都没有报错,请问有何区别,那种方式更标准?
谢谢各位了
...全文
131 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shinnyang 2010-01-19
  • 打赏
  • 举报
回复
学习了!呵呵!
icy_tear 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huaxiangdage 的回复:]
pFunc是什么?
[/Quote]

pFunc是函数指针变量
icy_tear 2010-01-19
  • 打赏
  • 举报
回复
谢谢各位了,应该规范点用第二种方式~
HUAXIANGDAGE 2010-01-19
  • 打赏
  • 举报
回复
pFunc是什么?
flyyyri 2010-01-19
  • 打赏
  • 举报
回复
学习了
tan870426 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 icy_tear 的回复:]
我的源代码是这样的:
C/C++ code
#include"stdio.h"int sum2(int a,int b)
{return (a+ b);
}int sum3(int a,int b,int c)
{return (a+ b+ c);
}int CallerReg3(int x,int y,int z,int (*f1)())
{return f1(x, y, z);
}int CallerReg2(int x,int y,int (*f1)())
{return f1(x, y);
}int main(int argc,char**argv)
{int c= CallerReg2(1,2, sum2);
printf("c = %d\n", c);int d= CallerReg3(1,2,3, sum3);
printf("d = %d\n", d);return0;
}

gcc编译,没有问题,运行也没问题啊,求助

运行结果:
c = 3
d = 6
[/Quote]

VS2008编译不过的,调用的时候匹配不到函数指针的

int CallerReg3(int x, int y, int z, int (*f1)())//编译器会int (*f1)()的参数表认为是void
{
return f1(x, y, z);
}

int CallerReg2(int x, int y, int (*f1)())//编译器会int (*f1)()的参数表认为是void
{
return f1(x, y);
}
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=195

参考这个,能理解函数指针就行了。
icy_tear 2010-01-19
  • 打赏
  • 举报
回复
我的源代码是这样的:

#include "stdio.h"

int sum2(int a, int b)
{
return (a + b);
}

int sum3(int a, int b, int c)
{

return (a + b + c);
}


int CallerReg3(int x, int y, int z, int (*f1)())
{
return f1(x, y, z);
}

int CallerReg2(int x, int y, int (*f1)())
{
return f1(x, y);
}

int main(int argc, char **argv)
{
int c = CallerReg2(1, 2, sum2);
printf("c = %d\n", c);
int d = CallerReg3(1, 2, 3, sum3);
printf("d = %d\n", d);

return 0;
}


gcc编译,没有问题,运行也没问题啊,求助

运行结果:
c = 3
d = 6
versaariel 2010-01-19
  • 打赏
  • 举报
回复
第一种是不是已经typedef过了
febbird1984 2010-01-19
  • 打赏
  • 举报
回复
不用管什么编译器,参数保持一致肯定没错,C里面没有参数的也记得写上void
xushuai0794 2010-01-19
  • 打赏
  • 举报
回复
我个人觉得你第一个是不能调用Sum函数的。第二种可以,因为你定义的函数和Sum函数想符合,才可以调用
traceless 2010-01-19
  • 打赏
  • 举报
回复
Faint~~

很明显第一种错了,什么编译器,太奇特了
pur_e 2010-01-19
  • 打赏
  • 举报
回复
怎么会不报错,2个错误
error C2197: 'int (__cdecl *)(void)' : too many actual parameters

error C2664: 'CallReg1' :cannot convert parameter 3 from 'int (int,int)' to 'int (__cdecl *)(void)'
james_hw 2010-01-19
  • 打赏
  • 举报
回复
运行有问题不?总感觉第一种不正确,建议用第二种

69,382

社区成员

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

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