C/C++語言中內(nèi)容完全相同的多個函數(shù),使用宏函數(shù)的寫法
假設(shè)有這樣一個需求:一個項目需要250個函數(shù),但這些函數(shù)體內(nèi)容完全相同,僅函數(shù)名不同,例如Func0、Func1、Func2...等等,這樣的要求怎么實現(xiàn)呢?(先不要問有沒有如此變態(tài)的需求)
當然可以使用手工先寫Func0函數(shù)體,再寫Func1函數(shù)體,....,一直寫到函數(shù)體Func250。假設(shè)寫完了后,項目需求有變,函數(shù)體內(nèi)有變化,還要從頭開始一個一個改.....?。。?/p>
如何使用宏函數(shù)實現(xiàn)這個需求?(先寫3個吧)
//這里是宏函數(shù)定義
// 這種函數(shù)定義基本覆蓋了所有的函數(shù)類型,
// 有參數(shù),有返回值
#define?FUNC(n)
int?Func##n(int?a,?int?b)
{
return?a+b;
}
//這里開始“實現(xiàn)”每一個函數(shù)體
// 將產(chǎn)生函數(shù)名為Func0、Func1、Func2的函數(shù)體
FUNC(0)
FUNC(1)
FUNC(2)
//FUNC(3)
//FUNC(n)
//自己往下接著寫吧.....
//再加深一步,使用函數(shù)指針數(shù)組引用這些函數(shù)
// 因為已經(jīng)定義了幾個函數(shù)名,反正使用時一定是函數(shù)指針數(shù)組訪問
int?(*fnFunc[2])(int,?int)?=?
{
Func0,
Func1,
Func2,
// Func3,
}
//主函數(shù)
void?main()
{
//①?訪問方式1
int?x?=?Func0(24,?15);
//②?訪問方式2
for?(int?i=0;?i<3;?i++)
{
int?y?=?fnFunc[i](12,?88);
}
}
使用VC編譯該程序,成功編譯后,可以查看宏展開文件。方法是:在【項目】--【設(shè)置】--【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個線程,每個線程訪問相同的一個回調(diào)函數(shù),并傳遞進入相同的參數(shù),但是這個回調(diào)函數(shù)不能只寫一個,應(yīng)該是一個線程對應(yīng)一個回調(diào)函數(shù),就是這樣一個問題。





