为什么要用函数作为函数的参数?要什么好处啊,举个例子啊。
最近在看mtk的源代码,很多用函数作为函数的参数,看的不太懂。
要什么好处啊,或者说为什么要这样作啊。。。。
80分给说的最好的两位,20分随机分给其他参与者。
void SetKeyHandler(FuncPtr funcPtr, U16 keyCode, U16 keyType)
{
/*----------------------------*/
/* Local Variables */
/*----------------------------*/
/*----------------------------*/
/* Code Body */
/*----------------------------*/
MMI_TRACE( (MMI_TRACE_G1_FRM, MMI_FRM_INFO_EVENT_SETKEY_HDLR, keyCode, keyType));
MMI_ASSERT((keyCode <MAX_KEYS) && (keyType <MAX_KEY_TYPE));
currKeyFuncPtrs[keyCode][keyType] = funcPtr;
}
SetKeyHandler(AlmPrepareInlineScreen,KEY_RIGHT_ARROW,KEY_EVENT_DOWN);
[解决办法]
不是函数体本身,而是传的函数指针
你提供的例子中,SetKeyHandler(AlmPrepareInlineScreen,KEY_RIGHT_ARROW,KEY_EVENT_DOWN);
传入实参AlmPrepareInlineScreen 也是函数指针
这样做的好处是,调用者不需要知道函数指针指向的函数堆栈里是如何实现功能的,你只要明白大概就可以(接口功能)。类似于java /C# 接口的概念。
这样处理接口实现就被隐藏起来。这就是面向对象的基本手段了。
如果AlmPrepareInlineScreen的实现在另外的实现文件中,调用者SetKeyHandler就不必重新编译了
。。。。
[解决办法]
函数指针的好处,笑面虎说的基本上差不多了。
我来说说函数指针的定义:
指向函数的指针就是函数指针,在定义这类指针变量时要指明函数返回值类型。定义一个指向整形函数的指针p可定义如下:int (*fp)(int a);
在定义函数指针的时候我们很容易犯如下的错误:int *fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整形指针的函数了,而不是函数指针,这一点尤其需要注意!
typedef定义可以简化函数指针的定义,在定义一个的时候感觉不出来,但定义较多的时候就体现出方便性了。
利用函数指针,可以构成指针数组,更明确点的说法是构成指向函数的指针数组,这么说可能就容易理解的多了。
#include <iostream>
#include <string>
using namespace std;
void t1(){cout < < "test1 ";}
void t2(){cout < < "test2 ";}
void t3(){cout < < "test3 ";}
void main(int argc,char* argv[])
{
void* a[]={t1,t2,t3};
cout < < "比较t1()的内存地址和数组a[0]所存储的地址是否一致 " < <t1 < < "| " < <a[0] < <endl;
cout < <a[0]();//错误!指针数组是不能利用数组下标操作调用函数的
typedef void (*fp)();//自定义一个函数指针类型
fp b[]={t1,t2,t3}; //利用自定义类型fp把b[]定义趁一个指向函数的指针数组
b[0]();//现在利用指向函数的指针数组进行下标操作就可以进行函数的间接调用了;
cin.get();
}
仔细看上面的例子可能不用多说你也会知道是怎么一会事情了,最后做一个重点小结,只要记住这一点,对于理解利用函数指针构成数组进行函数间接调用就很容易了!
void* a[]={t1,t2,t3};
cout < < "比较t1()的内存地址和数组a[0]所存储的地址是否一致 " < <t1 < < "| " < <a[0] < <endl;
cout < <a[0]();//错误!指针数组是不能利用数组下标操作调用函数的
上面的这一小段中的错误行,为什么不能这么调用呢?
指针数组元素所保存的只是一个内存地址,既然只是个内存地址就不可能进行a[0]()这样地址带括号的操作,而函数指针不同它是一个例外,函数指针只所以这么叫它就是因为它是指向函数指向内存的代码区的指针,它被系统授予允许与()括号操作的权利,进行间接的函数调用,既然函数指针允许这么操作,那么被定义成函数指针的数组就一定是可以一样的操作的。
[解决办法]
回调函数吧?
[解决办法]
回调函数, 也就规定了函数的参数和返回值
具体函数干啥的, 就由你说了算
干啥都行
呵呵 这不就加大了灵活性了啊
[解决办法]
函数参数是一个指针
该指针指向一个功能模块,有一点象函数调用
[解决办法]
以 简化的mfc消息映射机制为例 说明以下
一个消息发给程序,程序如何找到这条消息要调用的哪个函数呢
mfc用由有消息id和函数指针组成的二维表格的消息映射机制来解决
msg id pFuc
1 &fuc1
2 &fuc2
3 &fuc3
楼主的代码不是也是这样的一个二维表来存储函数指针吗?
好处楼主自己体会以下吧
[解决办法]
typedef void(*func)()
int functest(int a, void(*func)());
void test;
functest(1,test);
[解决办法]
经典的c语言里的qsort就是用的函数指针作参数的. 楼主可以看看它为什么用
[解决办法]
... 增加灵活性~~ 而且 很多时候用起来很方便~
我记得21天学通C里有介绍这个的作用(应用价值)~
挺好的~ 你不仿去书店看看~
[解决办法]
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b)
{
return a+b;
}
int sub(int a, int b)
{
return a-b;
}
int mul(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a/b;
}
int compute(int a, int b, int (*fun)(int,int))
{
return fun(a, b);
}
int main()
{
int a=10, b=2;
printf( "%d\n ", compute(a, b, add));
printf( "%d\n ", compute(a, b, sub));
printf( "%d\n ", compute(a, b, mul));
printf( "%d\n ", compute(a, b, division));
system( "PAUSE ");
return 0;
}