读书人

函数指针:模块接口解决办法

发布时间: 2012-03-23 12:06:21 作者: rapoo

函数指针:模块接口
一直以来都关注语法的掌握,怎么样写是对的,可以不报错,但是不怎么关注这个语法点在程序设计时应该怎么用。。。长久以来思维都僵化了,但是发现和我差不多的哥们也有很多,今天去中关村买书,有一个哥们说他一周看完了C语言,于是我就问了一句,函数指针有什么意义,他说可以赋一个函数地址然后调用。。。

我是有点意识到原来认识是有些问题,但是转变过来还是很慢的,所以也希望大家能分享一下你们的心得,看看有没有帮助,谢谢

-----------------------------------------
个人觉得允许直接调用函数的情况下使用函数指针意义不大,觉得更多的意义是可以作为模块之间的一种接口,例子之一就是回调,比如我使用模块A的一个方法,但是这个方法又对调用者存在依赖(AJAX服务器端执行完成以后需要把数据传递回调用者就是使用回调)

A模块方法定义
void A::f(void (*pf)(char *s))
{
...
pf("...");
}

------------------------------------------
//B模块能看到的原型
void A::f(void(*pf)(char*));
//B中的函数
void B::g(char *s)
{
printf("%s",s);
}
//B可以这样使用A的方法
A::f(&g);
//由于我们不能直接修改A的代码。但是又想让A使用我们的代码那么我们就和A进行约定,定义一个函数指针作为接口让A使用我们的代码 我觉得这个时候函数指针才是有意义的

[解决办法]
先顶一下
函数指针我用得很少,一般在回调函数中才用
[解决办法]
up先
[解决办法]
函数指针,在委托模式里还是挺有用的^_^
[解决办法]

[解决办法]
A::f(&g); ???
难道不是A::f(B::&g); 么?
[解决办法]
如果只用C的话,函数指针一般就是回调,作为人和人,项目组和项目组之间的接口,同一个人写的代码一般用不着函数指针,除非想引入设计模式
[解决办法]
你们说的其实是函数指针的用法,不是它的意义。

函数指针的存在,其意义在于让指针这种类型变得完整,虽然函数不是对象,但函数作为一个实体,在内存中也必然存在实体的地址,如果没有函数指针,如何表示函数实体的地址呢?函数的首地址如何参与表达式的计算呢?显然这会成为一种缺失。

这也是&func这种语法存在的依据,也正是这个原因, &func与func的地址值是相同的。
[解决办法]
JF
[解决办法]
JF,有了函数指针,C++语言要完整很多阿
[解决办法]

探讨
你们说的其实是函数指针的用法,不是它的意义。

函数指针的存在,其意义在于让指针这种类型变得完整,虽然函数不是对象,但函数作为一个实体,在内存中也必然存在实体的地址,如果没有函数指针,如何表示函数实体的地址呢?函数的首地址如何参与表达式的计算呢?显然这会成为一种缺失。

这也是&func这种语法存在的依据,也正是这个原因, &func与func的地址值是相同的。

[解决办法]
是这样的嘛??
[解决办法]
学习了
[解决办法]
The Benefits of Using Function Pointers:

http://stackoverflow.com/questions/667410/the-benefits-of-using-function-pointers
[解决办法]
Jump-table style lookup 也是函数指针的常用方式之一:

std::map<std::string,void(*)(const Data &)> commands;
commands["cp"]=&cpF;
commands["cd"]=&cdF;
commands["mv"]=&mvF;
commands["rm"]=&rmF;
//get user input
(*commands[input])(data);
[解决办法]
调用函数和做函数的参数,两个主要功能
[解决办法]
调用动态库时 需要定义函数指针接口
[解决办法]
其实我在实际应用中用到的函数指针挺多的。

1.表驱动(在很多模块中,如果处理的信息过于庞大,此时使用switch case简直是受罪,而使用表驱动使得框架明了清晰)

2.回调(前面已经提供了很多)

3.接口(这个在底层用的非常多,有时为了提高效率,直接使用指针+偏移地址来调用)

4.类(用c模拟类时,你会发现事件驱动用的都是函数指针)



大概这么多吧
[解决办法]
其实,做产品,或是更直接的编程的时候一般有两个层次的需要:一个是设计层面,一个是开发层面。
设计层面往往要着重满足需要,考虑如何更得体的处理数据,并且在行为方面更有效率的使用数据。
在开发层面上,往往要考虑语法要素,以及后续开发的多人协作问题,以及最重要的维护问题。

在从设计到开发过程当中,还涉及到开发工具,包括IDE,当然编译器的选择很重要,语言,你使用的是DotNet,还是C++,还是Java,或是C。

就C而言,它的语法特性决定了要实现大规模程序的时候,比较麻烦,而且后续的维护工具也很繁琐,这就是后来在发展过程中,会出现大量的面向对象语言里,提供的语法特性。

对于小程序而言,你使用什么都不要紧。但是当程序一大以后,多人协作开发就显得很重要。在这个过程当中,就如LZ所说的,模块和接口就变得很重要,而且考虑考后续的维护和扩展性,可能大家看到了很多很多的面向对象设计模式,也就是为了这些考虑,模拟功能的模块化,功能的继承性和维护得时候尽可能的简单。

当然,这些特性很复杂,用得好,可能事半功倍,用不好,就是乱来,还没有直接使用简单的函数,全局变量构成来得清晰。

之所以说这么多,想表达的一个意思是。语言本身提供了一些基本的特性,那么需要你学习的时候跳出这个语法特性,而考虑怎么应用。就像C语言的函数指针,其实语法本身不难,难的是应用,比如能够用来实现模拟面向对象里边类的成员函数,将实现和接口分开(回调),实现转换表(也就是同一个函数指针,在一定条件下,指向不同的函数定义)。

就简单的语法而言,函数指针可以用来给函数传函数参数,还可以用于调用函数。

但是当从应用角度而言的话,使用函数指针在满足基本的语法要求的基础上,那就多的多了,光一个可以将实现和接口分开,就可以实现很多很多思想了。

总结一下:贵在应用[color=#0000FF][/color][size=12px][/size]

[解决办法]
up

读书人网 >C语言

热点推荐