目錄
1. 回調(diào)函數(shù)的定義
2. 為什么要用回調(diào)函數(shù)
3. 怎么用回調(diào)函數(shù)
3.1 怎么使用沒有參數(shù)的回調(diào)函數(shù)
3.2 怎么使用帶參數(shù)的回調(diào)函數(shù)
1. 回調(diào)函數(shù)的定義
最近在工作中經(jīng)常用到回調(diào)函數(shù)callback,總結(jié)一下。
先來看看維基百科對callback的解釋:In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback.也就是說,把一段可執(zhí)行的代碼像參數(shù)傳遞一樣傳遞給其他代碼,而這段代碼會在某個時刻被調(diào)用執(zhí)行,這就叫回調(diào)。如果代碼被立即執(zhí)行就被稱為同步回調(diào),如果在之后晚點的某個時間再執(zhí)行,則被稱之為異步回調(diào)。
再來看看來自Stack Overflow某位大神的表述:A “callback” is any function that is called by another function which takes the first function as a parameter. 也就是說,函數(shù)F1調(diào)用函數(shù)F2的時候,函數(shù)F1調(diào)用函數(shù)F2時,F(xiàn)1通過參數(shù)給F2傳遞了另一個函數(shù)F3的指針,在F2執(zhí)行的過程中會調(diào)用函數(shù)F3,這個動作就是回調(diào)(callback),而被作為指針傳入、后面又被回調(diào)的函數(shù)F3就是回調(diào)函數(shù)。
最后再看看百度百科的解釋:回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。
2. 為什么要用回調(diào)函數(shù)
為什么不能像普通函數(shù)那樣在回調(diào)的地方直接寫上函數(shù)的名字呢?為什么非得用回調(diào)函數(shù)呢?其實在某些時候回調(diào)函數(shù)可以使用普通函數(shù)來實現(xiàn),但是回調(diào)函數(shù)還是有其存在的作用的。其中回調(diào)函數(shù)最大的好處就是解耦,因此普通函數(shù)不能完全替代回調(diào)函數(shù)。
#include<stdio.h>
#include<softwareLib.h>
int Callback() //Callback Function
{
//TODO
return 0;
}
int main()
{
//TODO
Library(Callback);
//TODO
return 0;
}
仔細一看,在回調(diào)函數(shù)中,主程序把回調(diào)函數(shù)像參數(shù)一樣傳入庫函數(shù)。這樣一來,只要改變傳進庫函數(shù)的參數(shù),就可以實現(xiàn)不同功能,并且絲毫不需要修改庫函數(shù)的實現(xiàn),這就是解耦。
另外,主函數(shù)和回調(diào)函數(shù)是在同一層的,而庫函數(shù)在另外一層。庫函數(shù)被封裝在庫中,不能修改庫函數(shù)的實現(xiàn),也就是說不能通過修改庫函數(shù)讓庫函數(shù)調(diào)用普通函數(shù)那樣實現(xiàn),那我們就只能通過傳入不同的回調(diào)函數(shù)了。
其實很多地方可以使用普通函數(shù)來替代回調(diào)函數(shù),但是如果需要降低耦合度的時候,更應(yīng)該使用回調(diào)函數(shù)。
3. 怎么用回調(diào)函數(shù)
3.1 怎么使用沒有參數(shù)的回調(diào)函數(shù)
首先來看沒有參數(shù)的回調(diào)函數(shù),下面是一個簡單的可以執(zhí)行的同步回調(diào)函數(shù)代碼。
#include<stdio.h>
int Callback_1()
{
printf("Hello, this is Callback_1 \n");
return 0;
}
int Callback_2()
{
printf("Hello, this is Callback_2 \n");
return 0;
}
int Callback_3()
{
printf("Hello, this is Callback_3 \n");
return 0;
}
int Handle(int (*Callback)())
{
printf("Entering Handle Function.\n");
Callback();
printf("Leaving Handle Function. \n");
}
int main()
{
printf("Entering Main Funtion. \n");
Handle(Callback_1);
Handle(Callback_2);
Handle(Callback_3);
printf("Leaving Main Function.\n");
return 0;
}
運行結(jié)果是:
Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3
Leaving Handle Function.
Leaving Main Function.
可以看到,Hanle()函數(shù)里面的參數(shù)是一個指針,在main()函數(shù)里調(diào)用Handle()函數(shù)時,給它傳入了Callback_1()/Callback_2()/Callback_3()的函數(shù)指針,也就是說,回調(diào)函數(shù)其實是函數(shù)指針的一種用法。再后頭看一遍:“A “callback” is any function that is called by another function which takes the first function as a parameter.” 是不是更明白一些呢?
3.2 怎么使用帶參數(shù)的回調(diào)函數(shù)
上一節(jié)我們知道了回調(diào)函數(shù)怎么使用,如果回調(diào)函數(shù)需要輸入?yún)?shù)呢?當(dāng)然可以使用帶參數(shù)的回調(diào)函數(shù)。只需要簡單修改一下上面的例子:
#include<stdio.h>
int Callback_1(int x) // Callback Function 1
{
printf("Hello, this is Callback_1: x = %d \n", x);
return 0;
}
int Callback_2(int x) // Callback Function 2
{
printf("Hello, this is Callback_2: x = %d \n", x);
return 0;
}
int Callback_3(int x) // Callback Function 3
{
printf("Hello, this is Callback_3: x = %d \n", x);
return 0;
}
int Handle(int y, int (*Callback)(int))
{
printf("Entering Handle Function. \n");
Callback(y);
printf("Leaving Handle Function. \n");
}
int main()
{
int a = 2;
int b = 4;
int c = 6;
printf("Entering Main Function. \n");
Handle(a, Callback_1);
Handle(b, Callback_2);
Handle(c, Callback_3);
printf("Leaving Main Function. \n");
return 0;
}
運行結(jié)果是:文章來源:http://www.zghlxwxcb.cn/news/detail-432417.html
Entering Main Function.
Entering Handle Function.
Hello, this is Callback_1: x = 2
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_2: x = 4
Leaving Handle Function.
Entering Handle Function.
Hello, this is Callback_3: x = 6
Leaving Handle Function.
Leaving Main Function.
可以看到,只需要回調(diào)函數(shù)增加一個參數(shù),如int Callback_1(int x)?,再在調(diào)用時增加一個參數(shù)(int Handle(int y, int (*Callback)(int))),傳遞給回調(diào)函數(shù)就行了,同理,也可以使用多個參數(shù)的回調(diào)函數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-432417.html
到了這里,關(guān)于Callback回調(diào)函數(shù)介紹(C語言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!