普通变量可以通过指针进行访问,用起来很方便,现在我有个想法,就是玩函数也要玩的这么炫,我想给它写个适配器……
这里我主要是用可变参数和函数指针来实现,有两个测试代码片段:test1()和test2()。其中test1用的是可变参数的函数指针,test2用的是宏实现的函数适配器。
代码如下:
1 /* 2 File : adapter.c 3 Author : Mike 4 E-Mail : Mike_Zhang@live.com 5 */ 6 #include7 #include 8 #include 9 #include 10 11 #define adapter(f,...) f(__VA_ARGS__) 12 typedef int(*fun)(int a,...); 13 14 int fun1(int a,int b) 15 { 16 return a+b; 17 } 18 19 int fun2(int a,char *str) 20 { 21 return a+strlen(str); 22 } 23 24 int fun3(int a,char *str,long l) 25 { 26 return a+strlen(str)+l; 27 } 28 29 void test1() 30 { 31 int a = 10,b = 2; 32 fun p; 33 34 printf("test1\n"); 35 36 p = (fun)fun1; 37 printf("%d\n",p(a,b)); 38 p = (fun)fun2; 39 printf("%d\n",p(a,(char*)"just a test")); 40 p = (fun)fun3; 41 printf("%d\n",p(a,(char*)"just a test",1)); 42 } 43 44 void test2() 45 { 46 int a = 10,b = 2; 47 fun p; 48 49 printf("test2\n"); 50 51 p = (fun)fun1; 52 printf("%d\n",adapter(p,a,b)); 53 p = (fun)fun2; 54 printf("%d\n",adapter(p,a,"just a test")); 55 p = (fun)fun3; 56 printf("%d\n",adapter(p,a,"just a test",1)); 57 } 58 59 int main() 60 { 61 test1(); 62 test2(); 63 return 0; 64 }
tips : gcc和VS2010都行,VC6跑不过,用的时候注意点。