2011-03-03 wcdj
问题来自这个帖子 。
问题大意为: 使用C语言定义一个通用的函数。根据不同的参数个数分别求三角形面积,矩形面积,梯形面积,圆形面积的函数。 float triangle(float,float);// 三角形 float circle(float r);// 圆形 float trapezium(float,float,float);// 梯形 分析: C语言不能使用默认参数吗?—— 默认参数是C++的特性,C中不支持 。 但是可以使用可变参数模拟默认参数 。类似 int printf ( const char * format, ... );
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define _crt_va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) #define _crt_va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define _crt_va_end(ap) ( ap = (va_list)0 )
一种实现:
#include <cstdio> #include <cstdarg> typedef float (*pFun)(int var_nums, ...); float calc_all(int var_num, ...); int main() { // 一般函数调用 printf("%f/n", calc_all(1,2)); printf("%f/n", calc_all(2,2,3)); printf("%f/n", calc_all(3,1,2,3)); // 函数指针调用 pFun p = calc_all; printf("%f/n", (*p)(1,2)); printf("%f/n", (*p)(2,2,3)); printf("%f/n", (*p)(3,1,2,3)); return 0; } float calc_all(int var_num, ...) { float a,b,c; a=b=c=0;// 设置参数默认值 float tmp; int i; va_list va_args; va_start(va_args,var_num); for (i=0; i<var_num;++i ) { tmp=(float)va_arg(va_args, int); switch(i) { case 0: a = tmp; break; case 1: b = tmp; break; case 2: c = tmp; break; } } va_end(va_args); //printf("a:%f b:%f c:%f/n",a,b,c); if (!b) { return 2*3.14*a*a; } else if (!c) { return a*b; } else { return 0.5*(a+b)*c; } }
更多参考: va_list、 va_start、va_arg、va_end的原理与使用