假设有这样一个需求:一个项目需要250个函数,但这些函数体内容完全相同,仅函数名不同,例如Func0、Func1、Func2...等等,这样的要求怎么实现呢?(先不要问有没有如此变态的需求)
当然可以使用手工先写Func0函数体,再写Func1函数体,....,一直写到函数体Func250。假设写完了后,项目需求有变,函数体内有变化,还要从头开始一个一个改.....!!!
如何使用宏函数实现这个需求?(先写3个吧)
//这里是宏函数定义
// 这种函数定义基本覆盖了所有的函数类型,
// 有参数,有返回值
#define FUNC(n) \
int Func##n(int a, int b)\
{\
return a+b;\
}
//这里开始“实现”每一个函数体
// 将产生函数名为Func0、Func1、Func2的函数体
FUNC(0)
FUNC(1)
FUNC(2)
//FUNC(3)
//FUNC(n)
//自己往下接着写吧.....
//再加深一步,使用函数指针数组引用这些函数
// 因为已经定义了几个函数名,反正使用时一定是函数指针数组访问
int (*fnFunc[2])(int, int) =
{
Func0,
Func1,
Func2,
// Func3,
}
//主函数
void main()
{
//① 访问方式1
int x = Func0(24, 15);
//② 访问方式2
for (int i=0; i<3; i++)
{
int y = fnFunc[i](12, 88);
}
}
使用VC编译该程序,成功编译后,可以查看宏展开文件。方法是:在【项目】--【设置】--【C++】底下的选项中添加“/P”(大写),编译时可以得到一个.i的宏展开文件:
int Func0(int a, int b){ return a+b;}
int Func1(int a, int b){ return a+b;}
int Func2(int a, int b){ return a+b;}
int (*fnFunc[2])(int, int) =
{
Func0,
Func1,
Func2,
}
void main()
{
int x = Func0(24, 15);
for (int i=0; i<3; i++)
{
int y = fnFunc[i](12, 88);
}
}
这样的使用需求会碰到的:一个项目创建了N个线程,每个线程访问相同的一个回调函数,并传递进入相同的参数,但是这个回调函数不能只写一个,应该是一个线程对应一个回调函数,就是这样一个问题。