如何理解C++函数指针实现C语言回调函数例子

当代码量比较小或者需求固定的時候可以在一个函数里绑定另一个函数,实现函数互调但当需要经常改变函数或需要实现动态调用时,绑定的参量就不能实现这时候需要用到函数指针和函数回调

C语言回调函数例子:C语言回调函数例子是一个不显式调用的函数,通过将C语言回调函数例子的地址传给调鼡者从而实现调用



函数指针:指向函数的指针可以把函数指针传入另一个函数作为形参,实现回调首先声明指针

void f();//这是一个函数原型,无输入输出void型

void (*)()//左边圆括弧中的星号是函数指针声明的关键,另外两个元素是函数的返回类型(void)和由边圆括弧中的入口參数注意还没有创建函数指针

void (*p) (); //声明指针,p是指向函数的指针该函数无输入,返回值的类型为void左边圆括弧里星号后的就是指针变量名。有了指针变量便可以赋值 

传递C语言回调函数例子的地址给调用者:现在可以将p传递给另一个函数(调用者) caller(),它将调用p指向的函数而此函数名是未知的:

这是比较简单的情况,大部分情况被调函数都有形参和返回值C语言回调函数例子也有返回值,但分析方法是相同的

}

在高性能网络服务器程序的开发過程中我们不能使用同步阻塞,同步非阻塞 异步阻塞这几种IO模型。这几种IO模型只能应对吞吐量较小或一般的应用面对巨大吞吐量的應用程序,如大型在线MMOG游戏服务器,登录服务器等的设 计通常都要采用异步非阻塞IO模型事件驱动的设计方法。事件驱动的设计中函数指针和C语言回调函数例子是必不可少的编程技术,函数指针是最为基础的知识本文 先详细描述函数指针的相关知识,打好基础为後续的开发做好准备。另一篇文章中讨论C语言回调函数例子

函 数指针提供了一些非常有趣,高效和优雅的编程技术你可以使用它们来替换switch/if语句,以实现自己的延迟绑定或者实现自己的C语言回调函数例子但是,需 要付出一些代价因为函数指针的语法相对复杂。在很多計算机书籍和文档中对函数指针的描述都停留在表面上。函数指针使用起来不像普通指针那样容易出错 因为我们不会用函数指针去分配和释放内存。要使用函数指针我们只需要理解什么是函数指针,熟悉函数指针的语法既可


         函数指针就是一个指针变量,用来指向函數地址对于函数地址,我们可能有些陌生不太容易理解。为此我们需要明白,正在运行的程序(也叫进程)在内存中 占据一定的空間进程包括编译好的程序代码和需要使用的变量。于是程序代码中的函数就是一些字符域,要得到一个函数地址也就是得到这些字苻域的起始地 址。唯一重要的是你(说编译器或处理器更恰当一些)如何解释指针指向的内存。

下页是用来说明函数指针如何替换if/switch语句偠用到的几个例子函数:

1. 函数指针的三种形式:

    前两种函数指针在本质上是一样的那么,什么是函数指针的本质指针的本质又是什么?我相信谁都知道指针的本质就是地址。那么函数指针的本质自然也就 是函数地址。我们定义函数指针的目的就是要用它来存放某个函数的地址问题在这里,类成员函数的地址表示和普通C函数的地址是不一样的要表示一个类例的成员 函数,光有函数地址还不夠因为每个类实例拥有一个非静态成员函数,而每个实例在内存中都要占据一定的空间所以,非静态类成员函数的地址由两部分组成一 个是    实例地址,一个是函数地址实例地址通过隐含的this指针来传递。函数地址就是函数在实例所占内存中的偏移地址只不过这个地址通过函数名取得,我们不 需要关心其偏移具体是多少.

    静态成员函数和非静态成员函数的区别是静态成员函数并不是第个实例都拥有一個这样的函数。所以静态成员函数的地址并不需要实例地址,也就是说没有this指针。其地址实质上和普通的C函数地址是一样的只不过茬定义函数指针时会有所不同。

    说到这里几者的区别已经很清楚了。第一种和第三种的区别两者的区别是:要得到一个类实例的成员函数指向非静态成员函数的函数指针需要一个隐含参数:指向类实例的this指针。而指向普通C函数的函数指针只需要得到函数地址既可 这兩种类型的函数指针是不兼容的,即不可互相赋值。

3. 将函数地址赋给函数指针


    将函数地址赋给函数指针比较简单直接将有效函数名(包括类成员函数名)作为右值赋给函数指针即可。但是为了程序可移植性,应该在函数名前加上取地址操 作符&, 即便这是可选的对于类成员函数,其地址必须包括类名和范围操作符(::).而且必须保证在赋值发生的地方这些函数是可见的

    注意,指向成员函数的指针的定义时需要指定类名:

6. 如何将函数指针作为参数传递


    这是C语言回调函数例子的关键,因为C语言回调函数例子中就需要将函数指针作为参数传递请看丅页的例子。
    值得注意的是如何将一个函数参数声明为函数指针。这和在外面定义函数指针语法是一样的将函数DoIt地址作为实参传递给函数PassPtr的形参时,

7. 如何返回一个函数指针

返回值类型是float.通过参数opCode确定该返回哪个函数下面这个定义需要注意的是,第一个float定义的是函数指針所指函数的返    回类型这个定义格式与平时所见到的函数定义语法有点不一样。返回函数指针的函数定义与普通函数的定义在形式上有些不同需要习    惯它。用正式语言描述下面这个定义: 定义了一个名为GetPtr1的函数其返回类型为一个函数指针,该指针所指的函数有两个float类    型参数返回类型为float. 再说一遍,这个float是所指函数的返回类型

    注意GetPtr2函数中,返回函数地址的方式也是直接在函数名前加取地址操作符

8. 如哬使用函数指针数组

}

C语言回调函数例子是由用户撰写而由操作系统调用的一类函数,C语言回调函数例子可以把调用者和被调用者分开调用者(例如操作系统)不需要关心被调用者到底是哪个函数,它所知道的就是有这么一类函数这类满足相同的函数签名(函数原型,参数返回值等),由用户书写完毕后在被调用就可鉯了实现上C语言回调函数例子一般都是通过函数指针来实现的。

典型的C语言回调函数例子是MFC 下的定时器处理函数ontimer你只需要添加这个消息响应函数,然后在初始化的时候将ontimer指针传递给操作系统操作系统就会按照设定好的时间来循环调用ontimer函数了、

你甚至可以将main函数理解成C語言回调函数例子,因为它不会被客户程序员调用只会被客户程序员撰写,然后由操作系统来调用类似的函数 SDK下的窗口过程函数,也昰C语言回调函数例子


}

我要回帖

更多关于 C语言回调函数例子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信