淺談C/C++回調函數(Callback)& 函數指針


摘要:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

按照上面的說法,實現一個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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM