摘要:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
按照上面的說法,實現一個C Language的回調函數如下,
#include <stdio.h> //回調函數 int ADD(int (*callback)(int,int), int a, int b){ return (*callback)(a,b);//此處回調add函數... } //普通函數 int add(int a, int b){ return a + b; } int main(void){ printf("%d\n",add(1,2)); printf("%d\n",ADD(add,1,2)); return 0; }
從上面的定義及其實現可以看出,回調函數必須有函數指針的存在,而這里函數指針一般可以先typedef一下,然后再使用,
一般格式: 返回值 (*指針名) (參數列表)
#include <stdio.h> //返回值(*指針名)(參數列表) typedef int (*callback)(int,int); //回調函數 int ADD(callback p, int a, int b){ return (*p)(a,b);//此處回調add函數... } //普通函數 int add(int a, int b){ return a + b; } int main(void){ printf("%d\n",add(1,2)); printf("%d\n",ADD(add,1,2)); return 0; }
可是,根據上面的例子,回調函數搞得這么麻煩,貌似並沒有什么大作用.....糾結!
別糾結,來看一下庫函數中的sort排序是怎么弄的。algorithm它提供了某些排序算法的實現(如冒泡排序、快速排序、shell排序、shake排序等等),為了能讓庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,能讓庫可用於多種數據類型(int、float、string),此時,該怎么辦呢?可以使用函數指針,並進行回調,如下:
#include <stdio.h> #include <algorithm> bool cmp(int a, int b){ return a > b; } int main(void){ int a[8] = {5,43,1,7,8,13,0,74}; std::sort(a,a+10,cmp);//callback return 0; }