回调函数就是一个通过函数指针调用的函数。
首先要了解函数指针的定义。
typedef void (*FuncType)(int, int); // 定义FuncType是一个函数指针类型
FuncType aaa = f2; // 定义aaa是一个FuncType类型的指针, 指向函数f2
aaa(1, 2); //该句相当于调用f2(1, 2);
下面是回调函数的定义与使用的一个例子(注意在函数指针作为参数时的定义方式)。
#include <iostream>
#include <stdio.h>
#include <stdarg.h>
using namespace std;
#ifndef __MYCALLBACK
#define __MYCALLBACK
#endif
// 这是回调函数f2
__MYCALLBACK void f2(int a, int b)
{
cout << "a + b" << " = " << a + b << endl;
}
// 这是回调函数f3
__MYCALLBACK void f3(int a, int b, int c)
{
cout << "a + b + c" << " = " << a + b + c << endl;
}
// 在该函数中调用回调函数, 函数参数的声明与使用
// 输入:回调函数cbFunc1, 回调函数cbFunc2, 至少1个整型参数
// 当整型参数(应以-1结尾)个数 == 3时调用cbFunc1, == 4时调用cbFunc2
void TestCallBack(void (*cbFunc1)(int, int), void (*cbFunc2)(int, int, int), int x1, ...)
{
int a = 0, b = 0, c = 0, i = x1, cnt = 0;
va_list marker;
va_start(marker, x1);
while (i != -1)
{
switch(++cnt)
{
case 1:
a = i;
break;
case 2:
b = i;
break;
case 3:
c = i;
break;
default:
break;
}
i = va_arg(marker, int);
}
va_end(marker);
if (cnt == 2)
(*cbFunc1)(a, b);
else if (cnt == 3)
(*cbFunc2)(a, b, c);
}
int main(int argc, char *argv[])
{
TestCallBack(f2, f3, 100, 20, -1);
TestCallBack(f2, f3, 3, 6, 9, -1);
return 0;
}