C/C++回調函數引見。本站提示廣大學習愛好者:(C/C++回調函數引見)文章只能為提供參考,不一定能成為您想要的結果。以下是C/C++回調函數引見正文
關於許多初學者來講,常常認為回調函數很奧秘,很想曉得回調函數的任務道理。本文將要說明甚麼是回調函數、它們有甚麼利益、為何要應用它們等等成績,在開端之前,假定你曾經熟知了函數指針。
甚麼是回調函數?
簡而言之,回調函數就是一個經由過程函數指針挪用的函數。假如你把函數的指針(地址)作為參數傳遞給另外一個函數,當這個指針被用為挪用它所指向的函數時,我們就說這是回調函數。
為何要應用回調函數?
由於可以把挪用者與被挪用者離開。挪用者不關懷誰是被挪用者,一切它需曉得的,只是存在一個具有某種特定原型、某些限制前提(如前往值為int)的被挪用函數。
假如想曉得回調函數在現實中有甚麼感化,先假定有如許一種情形,我們要編寫一個庫,它供給了某些排序算法的完成,如冒泡排序、疾速排序、shell排序、shake排序等等,但為使庫加倍通用,不想在函數中嵌入排序邏輯,而讓應用者來完成響應的邏輯;或許,想讓庫可用於多種數據類型(int、float、string),此時,該怎樣辦呢?可使用函數指針,並停止回調。
回調可用於告訴機制,例如,有時要在法式中設置一個計時器,每到必定時光,法式會獲得響應的告訴,但告訴機制的完成者對我們的法式一竅不通。而此時,就需有一個特定原型的函數指針,用這個指針來停止回調,來告訴我們的法式事宜曾經產生。現實上,SetTimer() API應用了一個回調函數來告訴計時器,並且,萬一沒有供給回調函數,它還會把一個新聞發往法式的新聞隊列。
另外一個應用回調機制的API函數是EnumWindow(),它列舉屏幕上一切的頂層窗口,為每一個窗口挪用一個法式供給的函數,並傳遞窗口的處置法式。假如被挪用者前往一個值,就持續停止迭代,不然,加入。EnumWindow()其實不關懷被挪用者在何處,也不關懷被挪用者用它傳遞的處置法式做了甚麼,它只關懷前往值,由於基於前往值,它將持續履行或加入。
不論怎樣說,回調函數是持續自C說話的,因此,在C++中,應只在與C代碼樹立接口,或與已有的回調接口打交道時,才應用回調函數。除上述情形,在C++中應應用虛擬辦法或函數符(functor),而不是回調函數。
上面是本身寫的一個簡略的回調函數,比擬其他的那些龐雜的代碼,這個更輕易懂得:
#include<stdio.h>
#include<stdlib.h>
void perfect(int n)
{
int i=1;
int count=0;
for(i=1;i<n;i++)
{
if(0==n%i)
{
count+=i;
}
}
if(count==n)
printf("%d是完數\n",n);
else printf("%d不是完數\n",n);
}
void myCallback(void (*perfect)(int ),int n)
{
perfect(n);
}
int main()
{
int n;
printf("請輸出一個正整數\n");
scanf("%d",&n);
myCallback(perfect,n);
return 0;
}