函数指针在Windows回调函数中用的比较多,其定义有两种方法:
void (*FUNC)(void);
void func(){
printf("Test FUNC!");
}
//FUNC = func; //这一行无法通过编译。
int main(){
FUNC = func;
(*FUNC)();
}
上面的代码是标准的声明方法,但是其缺点是只有一个函数指针,且不能在全局范围内对指针赋值,上面注释的那一行有问题,无法通过编译。另外如果想声明两个指针则还需要声明一行,比较麻烦。
typedef void (*FUNC)(void);
void func(){
printf("Test FUNC!");
}
FUNC Func = func; //这一行可以通过编译。
FUNC FUnc = func;
int main(){
(*Func)();
(*FUnc)();
}
为了简化声明,使用typedef将FUNC定义成为一个函数指针的类型,可以用它进行多个函数指针的变量声明。
class TABC(){
private:
int A;
public:
int getA();
TABC(int a):A(a){
}
}
typedef void (*FUNC)(TABC* abc);
void func(void* p){
TABC* abc = (TABC*)p;
printf("%d\n",abc->getA());
}
//ENUMFUNC一般是Windows API,这里简单的演示其内部调用方法。
void ENUMFUNC(FUCN func,void* p){
func(p);
}
int main(){
TABC* abc = new TABC(5);
ENUMFUNC(func,(void*)abc);
delete abc;
}
//上面为Windows API的标准回调方法,回调函数的参数通过p传入,需要强制转换
另外还有成员函数指针的用法参考:类成员函数指针的用法