[導讀]假設有這樣一個需求:一個項目需要250個函數,但這些函數體內容完全相同,僅函數名不同,例如Func0、Func1、Func2...等等,這樣的要求怎么實現呢?(先不要問有沒有如此變態(tài)的需求)當然可以使
假設有這樣一個需求:一個項目需要250個函數,但這些函數體內容完全相同,僅函數名不同,例如Func0、Func1、Func2...等等,這樣的要求怎么實現呢?(先不要問有沒有如此變態(tài)的需求)
當然可以使用手工先寫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);
}
}這樣的使用需求會碰到的:一個項目創(chuàng)建了N個線程,每個線程訪問相同的一個回調函數,并傳遞進入相同的參數,但是這個回調函數不能只寫一個,應該是一個線程對應一個回調函數,就是這樣一個問題。





