callback Function
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比蓋州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式蓋州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋蓋州地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。
回調函數(shù)是應用程序提供給Windows系統(tǒng)DLL或其它DLL調用的函數(shù),一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件。應用程序把回調函數(shù)的地址指針告訴DLL,而DLL在適當?shù)臅r候會調用該函數(shù)。回調函數(shù)必須遵守事先規(guī)定好的參數(shù)格式和傳遞方式,否則DLL一調用它就會引起程序或系統(tǒng)的崩潰。通常情況下,回調函數(shù)采用標準WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自己定義調用方式,但客戶程序也必須遵守相同的規(guī)定。在__stdcall方式下,函數(shù)的參數(shù)按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數(shù)都按值傳遞,函數(shù)返回之前自己負責把參數(shù)從堆棧中彈出。
理解回調函數(shù)!
程序在調用一個函數(shù)(function)時(通常指api).相當于程序(program)呼叫(Call)了一個函數(shù)(function)關系表示如下:
call(調用)
program --------------------→ dll
程序在調用一個函數(shù)時,將自己的函數(shù)的地址作為參數(shù)傳遞給程序調用的函數(shù)時(那么這個自己的函數(shù)稱回調函數(shù)).需要回調函數(shù)的 DLL 函數(shù)往往是一些必須重復執(zhí)行某些操作的函數(shù).關系表示如下:
call(調用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回調)
當你調用的函數(shù)在傳遞返回值給回調函數(shù)時,你就可以利用回調函數(shù)來處理或完成一定的操作。至于如何定義自己的回調函數(shù),跟具體使用的API函數(shù)有關,很多不同類別的回調函數(shù)有各種各樣的參數(shù),有關這些參數(shù)的描述一般在幫助中有說明回調函數(shù)的參數(shù)和返回值等.其實簡單說回調函數(shù)就是你所寫的函數(shù)滿足一定條件后,被DLL調用!
也有這樣的說法(比較容易理解):
回調函數(shù)就好像是一個中斷處理函數(shù),系統(tǒng)在符合你設定的條件時自動調用。為此,你需要做三件事:
1. 聲明;
2. 定義;
3. 設置觸發(fā)條件,就是在你的函數(shù)中把你的回調函數(shù)名稱轉化為地址作為一個參數(shù),以便于DLL調用。
在C語言中,一般情況下函數(shù)的返回值是通過函數(shù)中的return語句來實現(xiàn)的,每調用一次return語句只能從函數(shù)中返回一個值,下面我們就來看看C語言怎么讓一個函數(shù)返回多個值!
工具/材料
C語言的編輯器
01
全局變量傳遞
這種方式算是最不科學的規(guī)范,打破了軟件開發(fā)需要的閉環(huán)策略,但在基本語法上是支持的,C語言里面最好少涉獵全局變量,使用出錯的風險會提升很多,真要想使用建議還是用靜態(tài)全局變量直接在變量的前面加上static修飾符。
02
使用數(shù)組名或指針作為函數(shù)的形參
被調函數(shù)的行參是一個指針,然后在被調函數(shù)中返回第一個值,被調函數(shù)改變指針參數(shù)指向的值,這樣主調函數(shù)相應的值就改變了,也就相當于返回了第二個值了。這樣就可以實現(xiàn)返回多個值!
03
結構體指針返回
結構體是C語言涉及數(shù)據(jù)結構的最直接的容器,通常在編程過程中實現(xiàn)一個功能模塊在主函數(shù)里,我們可以定義一個結構體類型的變量,然后直接用函數(shù)返回值賦值就可以了。
回調函數(shù) 就是上層調用 設置下去
底層通過函數(shù)指針調用上層函數(shù)
多文件中才有用 單文件可以模擬
比如
#include?stdio.h
typedef?void?(*pFuncCb)?(int);//定義回調函數(shù)。
void?callback1(int?a)
{
printf("callback?function1?is?called?and?parameter?=?%d\n",?a);//打印1
}
void?callback2(int?a)
{
printf("callback?function2?is?called?and?parameter?=?%d\n",?a);//打印2
}
pFuncCb?callback_function;
void?lowerFunc(int?n)
{
int?i;
for(i?=?n;?i??n+10;?i?++)
if(callback_function)?callback_function(i);
}
int?main()
{
callback_function?=?callback1;
lowerFunc(1);//?會打印十次?打印1,?1到10
callback_function?=NULL;
lowerFunc(10);//沒有打印。
callback_function?=?callback2;
lowerFunc(100);//?會打印十次?打印2,?100到110
return?0;
}
主要可以通過指針或數(shù)組返回多個值,測試代碼如下,
//程序功能,通過結構體實現(xiàn)多個數(shù)據(jù)返回及通過多個變量指針實現(xiàn)
#include
stdio.h
#include
stdlib.h
#include
string.h
#define
PI
3.1415926
struct
test
{
int
x;
char
str[20];
};
//返回結構體,實現(xiàn)多個數(shù)據(jù)返回
struct
test*
getTest()
{
struct
test
*t=NULL;
t=(struct
test*)malloc(sizeof(struct
test));
if(!t)
return
NULL;
t-x=10;
memset(t-str,0,20);
memcpy(t-str,"testinfo",8);
return
t;
}
//變相返回圓的面積、周長
void
cir(double
r,double
*area,double
*girth)
{
*area=PI*r*r;
*girth=PI*r*2;
}
int
main(int
argc,
char
*argv[])
{
double
r=10.2;
double
s=0,g=0;
struct
test
*t1=getTest();
if(!t1)
return
1;
cir(r,s,g);
printf("area=%f,girth=%f\n",s,g);
printf("%d,%s\n",t1-x,t1-str);
if(t1)
{
free(t1);
t1=NULL;
}
return
0;
}
c語言函數(shù)名義上函數(shù)返回值只能有一個變量或者無返回值,但返回的變量可以是指針或結構體等更復雜的數(shù)據(jù),通過指針或結構體從而變相實現(xiàn)多參數(shù)返回。可以作為實參間接返回或直接作為返回值返回,但需注意不要返回臨時變量,如getTest()函數(shù)中不能定義struct
test
t變量直接返回。
當前名稱:c語言設置多個回調函數(shù) c語言回調函數(shù)
文章起源:http://chinadenli.net/article16/dodecgg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號、標簽優(yōu)化、外貿網(wǎng)站建設、App設計、網(wǎng)站營銷、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)