转载: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宏去取得地址,并实现它的调用。
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。
typedef void (*f1) ();// 为函数指针声明类型定义
void (*p) (); //p是指向某函数的指针
void func1()
{
/* do something */
printf("From func1(), Hello World!/n");
}
void caller(void(*ptrfunc1)())
{
ptrfunc1(); /* 调用ptr指向的函数 */
}
//typedef bool (*f2) (int *);// 为函数指针声明类型定义
//bool (*q) (int *); //p是指向某函数的指针
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指向的函数 */
}
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 */