㈠ 什麼是回調函數,英文用callback,為什麼叫回調函數,有什麼實際的功能
別人寫了一個函數,用來下載你的電話本。保存到一個文件裡面。
別人的函數(參數1,參數2)
然後你使用這個函數。每次調用之後,電話本就被保存到指定文件裡面了。
使用一段時間你會感覺,只是用這個函數是不錯,不過不知道下載的進度啊。
所以你就會要求把進度情況告訴你。
然後他就改進了一下
別人的函數(參數1,參數2,回調函數)
並且告訴你回調函數的格式如下
回調函數(參數1:當前數量,參數2:總數量)
你使用時必須按照這個格式定義一個函數,然後傳給他。
如下,別人的函數(參數1,參數2,你寫的回調函數名字)
這樣,你每次調用別人的函數的時候,你寫的那個回調函數就會被調用(如何調用是別人控制的了,你只需要在你的函數裡面處理好參數1 2就行了)
當然,很多時候回調是不分彼此的,這里寫的別人,和自己,只是為了好理解,意思就是表示2個調用和被調用的關系
剩下的你自己體會吧。
PS,你拿國王與飯舉例,實在有些牽強。
㈡ c語言回調函數究竟有什麼用處我覺的用普通的函數調用替換也可以,謝謝
從功抄能上來說 普通函數也是可以襲的
但在比較大的程序設計中 會對很多功能模塊進行封裝
比如 上層一個模塊
底層一個模塊
同時規定,上層可以調用底層的函數,但是底層不可以調用上層函數。
這時就需要使用回調函數。
通過上層調用底層的注冊回調借口,傳入回調指針。
實現底層通知上層的作用。
另外 回調函數的一個好處是,可以通過回調函數,調用不同介面。
比如接收數據,不同數據需要不同的解析函數。
但是接收數據的流程是相同的
這樣 使用回調函數,在接收數據的時候就可以不用判斷,而是自動使用不同的解析函數。
總之 使用回調函數,可以降低耦合,實現多樣性。
㈢ 怎麼理解回調函數回調函數有什麼好處
你就想像你函數的一部分功能被外包給別人。至於被人怎麼實現的你不用管,你的函數具有一個完整的功能,但是有的功能可以隨你自己定製,參照stl中的for_each
㈣ 為什麼要使用回調函數
回調函數和一般的指針傳遞其實沒什麼區別,你想讓strcpy拷貝你指定的字元串,那就傳個字元傳指針;如果你想讓某個函數執行你自定義的函數,就傳函數指針……
回調函數,是應付某一類需求最自然的方法,你為什麼不問「為什麼strcpy要穿個char*?為什麼不換種方法呢?」
㈤ 什麼是回調函數
回調函數就是一個通過函數指針調用的函數。
如果把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,那就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
不管怎麼說,回調函數是繼承自C語言的。在C++中,應只在與C代碼建立介面或與已有的回調介面打交道時,才使用回調函數。除了上述情況,在C++中應使用虛擬方法或仿函數(functor),而不是回調函數。
(5)串口回調函數有什麼用擴展閱讀
回調函數的好處:
1、回調函數可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。簡而言之,回調函數就是允許用戶把需要調用的函數的指針作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。
2、回調可用於通知機制。例如,有時要在A程序中設置一個計時器,每到一定時間,A程序會得到相應的通知,但通知機制的實現者對A程序一無所知。那麼,就需一個具有特定原型的函數指針進行回調,通知A程序事件已經發生。實際上,API使用一個回調函數SetTimer()來通知計時器。
㈥ 回調函數和普通函數有什麼區別
普通函數與回調函數主要是在調用方式上有區別:
1、對普通函數的調用:調用程序發出對普通函數的調用後,程序執行立即轉向被調用函數執行,直到被調用函數執行完畢後,再返回調用程序繼續執行。從發出調用的程序的角度看,這個過程為「調用-->等待被調用函數執行完畢-->繼續執行」。
2、對回調函數調用:調用程序發出對回調函數的調用後,不等函數執行完畢,立即返回並繼續執行。這樣,調用程序執和被調用函數同時在執行。當被調函數執行完畢後,被調函數會反過來調用某個事先指定函數,以通知調用程序:函數調用結束。這個過程稱為回調(Callback),這正是回調函數名稱的由來。
一般函數(General function)是相對於比較特殊,比較少見的函數而言的,在任一學科內,指的是作用能力比較基層,使用比較普遍的函數,但同時它也是構成某整個作用域中不可缺少的元素。列如:c語言中的printf(),scanf()函數就是c語言中的一般函數,它們用於各類數據輸出和輸入,是很常用的的庫函數,基礎但很重要。
㈦ 回調函數的用法和好處
函數調用形式本身沒有好壞之分
任何函數代碼如果有錯誤都可能導致軟體出問題,甚至導致崩潰
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 的代碼作了修改,也不必改動庫的代碼,就可以正常實現調用
便於程序的維護和升級
㈧ 什麼引起串口中斷
SBUF中的數據發送完畢,TI傳送結束標志置1,如果設置了ES=1(串口中斷是允許的),就進入串口中斷服務程序。解決方法如下:
1、首先打開Cube工程,在Pinout頁使能需要使用的串口。
㈨ cc2541中回調函數是什麼意思
所謂回調函數,就是由事件或中斷觸發的相關處理函數執行完後,可調用用戶指定的用戶處理函數。這種回調函數是系統事件處理函數為用戶編程,進行事件的用戶級處理保留的介面,回調函數的格式是固定的,通常情況下回調函數指針被賦值成NULL,表示沒有用戶回調函數,當用戶需要增加自己的處理函數時(比如串口接收信息後用戶需要處理串口數據時),就按照指定回調函數的格式,寫一個自己的處理函數,然後將這個函數的地址賦值給回調函數指針,當系統處理事件時,發現回調函數指針不為NULL了,就執行其指向的函數,這樣,用戶的處理函數就會在事件發生時得到一次執行。
㈩ 如何理解回調函數的作用與實現
回調函數的主要作用:
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();
}