2017/03/10 更新
后来思考了一下,其实这基本就是C#里委托的一种用法。
才疏学浅,知道的太少才会出现下面这篇博文,我也不想删掉,放在这里作为自己的一个警示。
------------------------------------------------------------------------------------------------------------------------------------
昨天和今天在工作里写代码的时候,想把一段遍历的代码共用,但是苦于里面要做的处理过程和变量数目都有相当大的区别。
所以想用标题上的方法来解决这个问题,代码如下:
1 #include <stdio.h> 2 #include <stdarg.h> 3 4 typedef int(*FunType)(int, int, ...); 5 int test(FunType ft, int num, ...); 6 int inner_fun_1(int a, int b); 7 int inner_fun_2(int a, int b, int c); 8 9 int main() 10 { 11 //这两个函数简单起见就做了个加法,可以完全不同的处理过程 12 test(inner_fun_1, 1, 2); 13 test(inner_fun_2, 1, 2, 3); 14 } 15 16 int inner_fun_1(int a, int b) 17 { 18 return a + b; 19 } 20 21 int inner_fun_2(int a, int b, int c) 22 { 23 return a + b + c; 24 } 25 26 int test(FunType ft, int num, ...) 27 { 28 va_list argp; 29 int i; 30 int para; 31 int para_arr[2]; 32 33 va_start(argp, num); 34 35 for (i = 0; i < 2; i++) { 36 para = va_arg(argp, int); 37 if (para == NULL) { 38 break; 39 } 40 para_arr[i] = para; 41 printf("additional arg[%d]: %d ", i, para); 42 } 43 va_end(argp); 44 45 if (i == 1) { 46 printf("res_1: %d ", ft(num, para_arr[0])); 47 } else { 48 printf("res_2: %d ", ft(num, para_arr[0], para_arr[1])); 49 } 50 }
上面是一个比较简单的例子。
做成这样不知道是我一开始思路有错,抑或有更加优秀的办法。