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