轉載:http://blog.csdn.net/vsooda/article/details/7435801程序員
轉載:http://blog.csdn.net/lincyang/article/details/29175413編程
回調函數的參數格式是由回調函數的調用者(通常是Windows)來定義的,而回調函數的實現者必須遵循這種格式。Windows程序是以事件驅動模型爲基礎的,這就必然要用到回調函數這種機制。
要透徹瞭解回調函數,多看看SDK Samples。而MFC中的消息映射機制已經將窗口消息響應的回調函數隱藏起來了,這也符合C++的編程思想,回調函數終究是一種全局函數,它不能在類中實現,而消息映射機制的目的是使消息響應的代碼最終封裝在窗口類(CWnd類的子類)中。函數
若是有時間,不妨看看MESSAGE_MAP宏,消息映射是回調函數,只是這種回調函數的用法不一樣而已。普通的回調函數是要你提供地址,傳進某個函數,由它去調用;而消息映射函數,倒是由你定義函數,由MESSAGE_MAP宏去取得地址,並實現它的調用。spa
回調函數是一個程序員不能顯式調用的函數;經過將回調函數的地址傳給調用者從而實現調用。要實現回調,必須首先定義函數指針。儘管定義的語法有點難以想象,但若是你熟悉函數聲明的通常方法,便會發現函數指針的聲明與函數聲明很是相似。.net
typedef void (*f1) ();// 爲函數指針聲明類型定義
void (*p) (); //p是指向某函數的指針
void func1()
{
/* do something */
printf("From func1(), Hello World!/n");
}指針
void caller(void(*ptrfunc1)())
{
ptrfunc1(); /* 調用ptr指向的函數 */
}code
//typedef bool (*f2) (int *);// 爲函數指針聲明類型定義
//bool (*q) (int *); //p是指向某函數的指針blog
bool func2(int* t_i)
{
/* do something */
printf("From func2() = %d, Hello World!/n", (*t_i)++);
return true;
}事件
void caller2(bool (*ptrfunc2)(int *), int * i)
{
ptrfunc2(i); /* 調用ptr指向的函數 */
}get
int main(int argc, char* argv[])
{
printf("From main(), Hello World!/n");
printf("/n");
//無參數調用
p = func1; /* 傳遞函數地址地址 */
caller(p); /* 傳遞函數地址到調用者 */
//有參數調用
int i = 0;
for (int j = 0; j < 10; j++)
{
caller2(func2, &i); //* 傳遞函數地址到調用者 */
}
//有參數調用第二次
i = 0;
//q = func2; /* 傳遞函數地址地址 */
//caller2(q, &i); /* 傳遞函數地址到調用者 */
printf("/n");
printf("From main(), Hello World!/n");
getchar();
return 0;
}
1 #include <stdlib.h> 2 #include <stdio.h> 3 int Test1() 4 { 5 int i; 6 for (i=0; i<30; i++) 7 { 8 printf("The %d th charactor is: %c/n", i, (char)('a' + i%26)); 9 } 10 return 0; 11 } 12 13 int Test2(int num) 14 { 15 int i; 16 for (i=0; i<num; i++) 17 { 18 printf("The %d th charactor is: %c/n", i, (char)('a' + i%26)); 19 } 20 return 0; 21 } 22 23 void Caller1(int (*ptr)()) 24 //指向函數的指針做函數參數 25 { 26 (*ptr)(); 27 } 28 29 void Caller2(int n, int (*ptr)(int n)) 30 //指向函數的指針做函數參數,這裏第一個參數是爲指向函數的指針服務的, 31 { 32 //不能寫成void Caller2(int (*ptr)(int n)),這樣的定義語法錯誤。 33 (*ptr)(n); 34 return; 35 } 36 int main() 37 38 { 39 40 printf("************************/n"); 41 42 Caller1(Test1); //至關於調用Test1(); 43 44 printf("************************/n"); 45 46 Caller2(30, Test2); //至關於調用Test2(30); 47 48 return 0; 49 50 } 51 52 /* 53 int main() 54 55 { 56 57 printf("************************/n"); 58 59 Caller1(&Test1); //至關於調用Test1(); 60 61 printf("&&&&&&************************/n"); 62 63 Caller2(30, &Test2); //至關於調用Test2(30); 64 65 return 0; 66 67 } 68 */