Ⅰ 回調函數的用法和好處
函數調用形式本身沒有好壞之分
任何函數代碼如果有錯誤都可能導致軟體出問題,甚至導致崩潰
c 里可以使用指針,函數指針
這就使程序可以更靈活
當 函數指針 做為函數的參數,傳遞給一個被調用函數,
被調用函數就可以通過這個指針調用外部的函數,這就形成了回調
windows程序中 WndProc 就是使用回調的典型形式
一般的程序中回調函數作用不是非常明顯,可以不使用這種形式
最主要的用途就是當函數不處在同一個文件當中,比如動態庫,要調用
其他程序中的函數就只有採用回調的形式
#include "stdio.h"
#include "conio.h"
int add(int a, int b);
int libfun(int (*pDis)(int a, int b));
int main(void)
{
int (*pfun)(int a, int b);
pfun = add;
libfun(pfun);
}
int add(int a, int b)
{
return a + b;
}
int libfun(int (*pDis)(int a, int b))
{
int a, b;
a = 1;
b = 2;
printf("%d", pDis(a, b));
}
現在這幾個函數是在同一個文件當中
假如
int libfun(int (*pDis)(int a, int b))
是一個庫中的函數,就只有使用回調了,通過函數指針參數將外部函數地址傳入
來實現調用
函數 add 的代碼作了修改,也不必改動庫的代碼,就可以正常實現調用
便於程序的維護和升級
Ⅱ 回調函數的用法請舉例
我理解的回調函數就是將一個回調函數(固定的輸入參數個數與類型)的指針交給操作系統版,
當滿足回調函數的權調用條件時操作系統會自動調用回調函數,並將參數傳入回調函數
我們一般的程序按自已的流程走,一般用不到回調,但要響應事件時就要用到回調函數
因為不能像在DOS中那輪詢事件是否發生,只能靠操作系統在發出事件時調用事件的處理函數
Ⅲ C語言的回調函數怎麼用,請幫忙舉例說明
看一下這個例子吧,我是這樣理解的:
#include
"iostream.h"
#include
"windows.h"
typedef
void
(CALLBACK
*MyFun)(void);//回調函數定義
void
CALLBACK
callback()
//
回調函數
{
cout<<"****callback****\n";
}
void
Call_CallBack(MyFun
mycb)
{
cout<<"****Call_CallBack****\n";
mycb();
cout<<"__________________\n";
}
void
main()
{
Call_CallBack(callback);
}
//
其他人內需要修改的容話只要修改callback函數里的內容就行了,一般sdk封裝後都會有回調,這樣他人在調用sdk的時候就可以實現回調函數里的內容。
如果你需要理論的,網上搜回調函數,內容哈多隨便看
Ⅳ 回調函數一般都什麼作用求解
1.回調函數是一個很有用,也很重要的概念。當發生某種事件時,系統或其他函數將會自動調用你定義的一段函數。
2.回調函數就相當於一個中斷處理函數,由系統在符合你設定的條件時自動調用。為此,你需要做三件事:1,聲明;2,定義;3,設置觸發條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便於系統調用。
3.所謂回調函數就是按照一定的形式由你定義並編寫實現內容,當發生某種事件時,而由系統或其它函數來調用的函數。使用回調函數實際上就是在調用某個函數時,將自己編寫的一個函數的地址作為參數傳遞給那個函數。而那個函數在需要的時候,也就是某種事情發生的時候,利用傳遞的函數地址調用回調函數,這時你可以利用這個機會在回調函數中處理消息或完成一定的操作。回調函數只能是全局函數,或者是靜態函數,因為這個函數只是在這個類中使用,所以為了維護類的完整性,我們用類的靜態成員函數來做回調函數。
4.對於很多初學者來說,往往覺得回調函數很神秘,很想知道回調函數的工作原理。本文將要解釋什麼是回調函數、它們有什麼好處、為什麼要使用它們等等問題,在開始之前,假設你已經熟知了函數指針。
(1)什麼是回調函數?
簡而言之,回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。
(2)為什麼要使用回調函數?
因為可以把調用者與被調用者分開。調用者不關心誰是被調用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被調用函數。
如果想知道回調函數在實際中有什麼作用,先假設有這樣一種情況,我們要編寫一個庫,它提供了某些排序演算法的實現,如冒泡排序、快速排序、shell排序、shake排序等等,但為使庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,想讓庫可用於多種數據類型(int、float、string),此時,該怎麼辦呢?可以使用函數指針,並進行回調。
回調可用於通知機制,例如,有時要在程序中設置一個計時器,每到一定時間,程序會得到相應的通知,但通知機制的實現者對我們的程序一無所知。而此時,就需有一個特定原型的函數指針,用這個指針來進行回調,來通知我們的程序事件已經發生。實際上,SetTimer()API使用了一個回調函數來通知計時器,而且,萬一沒有提供回調函數,它還會把一個消息發往程序的消息隊列。
另一個使用回調機制的API函數是EnumWindow(),它枚舉屏幕上所有的頂層窗口,為每個窗口調用一個程序提供的函數,並傳遞窗口的處理程序。如果被調用者返回一個值,就繼續進行迭代,否則,退出。EnumWindow()並不關心被調用者在何處,也不關心被調用者用它傳遞的處理程序做了什麼,它只關心返回值,因為基於返回值,它將繼續執行或退出。
不管怎麼說,回調函數是繼續自C語言的,因而,在C++中,應只在與C代碼建立介面,或與已有的回調介面打交道時,才使用回調函數。除了上述情況,在C++中應使用虛擬方法或函數符(functor),而不是回調函數。
Ⅳ C++中的回調函數函數怎麼用
就是在執行beginthreadex的過程中會調用wrkFun函數,或者beginthreadex會記錄下wrkFun這個指針所指的地址,在適當的時候調用這個函數。
Ⅵ 什麼是C語言的回調函數具體怎麼用呢
回調函數,抄顧名思義,也就是襲等該函數執行完了,會回去調用我們傳進去的函數。
用到回調函數的地方有不少,像我見過的:SQLite中的一個函數,sqlite_exec函數名有沒有記錯我沒什麼印象了。待這個函數執行完畢後,會去調用我傳進去的一個函數,一般回調函數都是有自己的參數列表格式的,再利用這個格式從回調函數中獲取到我們需要的一些值。
Ⅶ C語言中回調函數怎麼用的,能不能舉個例子
庫函數qsort就是一個回調函數,你可以去搜搜qsort與回調函數,回調函數就是函數指針做另一個函數的參數
Ⅷ 回調函數 返回json數據 怎麼使用
(1)如果是jquery封裝的ajax方法,可以配置好參數,設置返回數據的類型為json,這樣回調函數裡面接到的就是一個json對象,可以直接用data.xxx取出裡面的屬性.(2)如果不是用的框架ajax方法,返回的就是個字元串,可以使用js的eval("("+data+")")方法將字元串轉為json對象.
Ⅸ 怎麼理解回調函數回調函數有什麼好處
你就想像你函數的一部分功能被外包給別人。至於被人怎麼實現的你不用管,你的函數具有一個完整的功能,但是有的功能可以隨你自己定製,參照stl中的for_each
Ⅹ 如何理解回調函數的作用與實現
回調函數的主要作用:
1.回調函數就是本模塊實現的回調函數,但是調用卻不是自己來調,而是由別的模塊來調的
2.可更好的把握調用函數的時機,
回調函數依賴對應注冊回調的模塊,回調函數由該模塊觸發,觸發的條件、時間點,都是由該模塊控制
(通常由該模塊的事件消息,觸發)
3.在不同模塊間進行使用,可令觸發邏輯與業務邏輯分離,讓代碼功能性上更為清晰,易懂
注意點:
回調函數跑的事情,都是在觸發回調的線程下進行的,如果回調函數中干很多事,很容易造成觸發模塊-所屬線程堵塞
這對於多線程編程時,需特別注意,線程堵塞,會影響其他線程運行時序,造成一些bug
通常用法:
以庫的形式,供別人調用實現
以上是根據網上相應資料,再加上自己的總結體會,整理出來的
下面是自己寫的一個回調函數-用法的例子:
主要 分成2個模塊
A模塊為定義回調函數的模塊,負責觸發回調,一般為事件消息模塊
B模塊為實現回調函數的模塊,一般為處理業務邏輯模塊
A模塊需向B模塊暴露定義及注冊回調介面
typedef void (*TestCB)(char testData);
void A_SetTestCb(TestCB pTestCb)
B模塊實現具體的回調函數就可以了,本例中即B_UserTestCbDetail(char testData)
主要分3步:注冊回調函數->消息事件觸發回調函數->執行回調函數
附代碼:
#include "stdio.h"
//定義回調函數-別名,方便後續使用------需提供給模塊B
typedef void (*TestCB)(char testData);
//模塊A內部的全局回調變數,用於模塊A內部綁定注冊回調用
TestCB g_pTestCbHandle;
/*****************************************************
模塊A對外函數---------需提供給模塊B
模塊A內部定義的全局callback變數與外部模塊注冊的
回調函數綁定起來,用於後續模塊A,滿足觸發條件後,觸
發回調
******************************************************/
void A_SetTestCb(TestCB pTestCb)
{
g_pTestCbHandle = pTestCb;
}
/*****************************************************
模塊A內部函數
通常為A模塊因為某些條件符合了,觸發了對應的事件
從而調用對應的callback函數
******************************************************/
void A_CallTestCb()
{
char testData = 100;
//觸發調用回調實現函數
g_pTestCbHandle(testData);
}
/*****************************************************
模塊B內部函數
模塊B實現的回調函數-具體操作
******************************************************/
void B_UserTestCbDetail(char testData)
{
printf("step 3\n");
printf("[do] call-back\n");
//具體實現
printf("UserTestCbDetail, call back is achieve! testData = %d\n", testData);
}
void main()
{
printf("step 1\n");
printf("[register] call-back\n");
A_SetTestCb(B_UserTestCbDetail);
printf("step 2\n");
printf("[call] call-back\n");
A_CallTestCb();
}