函数指针的一般用法,网上一大堆,这里说的是在结构体中定义函数指针,结合外部函数形成回调函数的用法。说的负载其实也非常简单。
函数指针的例子:
#include <iostream>
using namespace std;
typedef void (*funcptr)(void);// 通用指针类型
void hello(void)
{
int a=1;
printf("Hello!%d",a);
}
void bye(void)
{
int a=2;
printf("bye%d",a);
}
int main()
{
funcptr aaa[2]={&hello,&bye};
aaa[0]();
cout<<endl;
aaa[1]();
cout<<endl;
}
函数指针应用与结构体
#include <iostream>
using namespace std;
typedef struct _struct
{
int a;
void (*exp1)();
int (*exp2)();
double (*exp3)();
}struct_exp;
void aaa()
{
cout<<"aaa"<<endl;
}
int bbb()
{
cout<<"bbb"<<endl;
return 2;
}
double ccc()
{
cout<<"CCC"<<endl;
return 3.1;
}
int main()
{
struct_exp *exp333;
exp333->a=1;
exp333->exp1=aaa;
exp333->exp2=bbb;
exp333->exp3=ccc;
exp333->exp1();
cout<<exp333->exp2()<<endl;
cout<<exp333->exp3()<<endl;
//if(exp333->exp2()==2)
}
这样即可把函数放在结构体中,类似于C++的类,有利于封装。当然这不是最终要的,关键的还是回调函数。
说白了就是结构体中定义函数指针,在调用一个函数的时候,在函数的内部再调用外部函数。
下面的例子就是主函数调用bbb的时候,bbb调用了aaa函数。形成回调!
#include <iostream>
using namespace std;
typedef struct STR
{
void (*exp1)();
}str_exp;
void aaa()
{
cout<<"aaa"<<endl;
}
void bbb(STR *temp_str)
{
temp_str->exp1();
}
int main()
{
str_exp *exp;
exp->exp1=aaa;
bbb(exp);
}
回调函数在多文件和动态库中应用较多,对于只有一个文件的程序完全没必要,最近看stm的usb例程,真的是尼玛一坨一坨的回调函数啊~~~~~~~