zoukankan      html  css  js  c++  java
  • C++学习笔记(四)指针(2)转

     

    分类: C++学习笔记 2010-04-03 14:11 283人阅读 评论(0) 收藏 举报 

     

    回调函数和函数指针 

    最近在看代码,写代码的人很喜欢用回调函数和函数指针。一直觉得回调函数和函数指针挺神秘的,所以查了一些资料,来与大家一起来分享。

    什么是回调函数

    简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

    为什么要使用回调函数

      因为使用回调函数可以把调用者和被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。

    如何使用回调函数

     使用回调函数,我们需要做三件事:

    · 声明 

    · 定义 

    · 设置触发条件:在你的函数种把你的回调函数名称转化为地址作为一个参数,以便于系统调用。 

    声明和定义时应注意,回调函数由系统调用,所以可以认为它属于windows系统不要把它当作你的某个类的成员函数。Opijn ipoj ipo

    回调函数是一个程序员不能显示调用的函数,通过将回调函数的地址传给调用者从而实现调用。回调函数是十分必要的,在我们想通过一个统一接口实现不同的内容,这时回调函数非常合适。

    函数指针的声明

    对回调函数有了一个初步的了解,下面我们来说一下函数指针。因为要实现回调,必须首先定义函数指针。

    void (*) ()

    左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数

    为函数指针声明类型定义:

    Typedef void(* pfv)()

    pfv 是一个函数指针,它指向的函数没有输入参数,返回类型为void。使用这个类型定义名称可以隐藏负责的函数指针语法。

    void (*p)();

    void func()

    {

    ……

    }

    p = func;

    p的赋值可以不同,但一定要是函数的指针,并且参数和返回类型相同。

    例如:

    现学现卖的一个小例子

     

    #include <iostream>

     

    using namespace std; 

     

    typedef void (*PF)();

     

    void func()

     

    {

     

      cout << "func" << endl;

     

    }

     

    void caller( PF pf)

     

    {

     

      pf();

     

    }

     

    int main()

     

    {

     

      PF p = func;

     

      caller(p);

     

      system("pause");

     

      return 0;

     

    }

     

    调用约定

    visual c++中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示调用规范(默认为_cdecl)。调用规范影响编译器产生的给定函数名,参数传递的顺序,堆栈清理责任以及参数传递机制。

    不过,在win32的程序中,我见得比较多的是CALLBACK,这个宏定义在windef.h中,

    #define CALLBACK    __stdcall

    它约定了函数在它们返回到调用者之前,都会从堆栈中移除掉参数。

     

     

  • 相关阅读:
    《C#高级编程》读书笔记(十五):任务、线程和同步之二 任务
    sklearn训练模型的保存与加载
    机器学习中样本不平衡的处理方法
    剑指Offer(四):重建二叉树
    剑指Offer(三):从尾到头打印链表
    机器学习笔记(一)----基本概念
    100 个网络基础知识普及,看完成半个网络高手
    协方差基本概念及公式
    正态分布基本概念及公式
    np.random.multivariate_normal方法浅析
  • 原文地址:https://www.cnblogs.com/carbs/p/2430283.html
Copyright © 2011-2022 走看看