查看文章 |
如何实现参数个数不定的函数?
2008-03-08 15:32
原理就是声明一个类似 int func ( char *fmtstr, ...)的函数 然后在函数中判断fmtstr的下一个参数的类型如float,然后将fmtstr的地址+sizeof(float),得出的值作为那个float参数的地址。以此类推。 但是手工这么实现有点太繁了,又容易出错,所以一般的编译器实现中有一些宏来完成这些动作。就是va_list之类的。 void foo( parm_list, ...); void foo( ...); 第一种形式为特定数目的函数参数提供了声明.当函数调用时,对于与显示声明的参数 相对应的实参进行类型检查,而与活略号对应的实参则挂起类型检查. 参数后面的逗号是可选的. 第二种形式则用于无法列出传递给函数的所有实参的类型和数目时.省略号挂起类型 检查机制. 例1 logmsg(const char* szformat, ...) { char szmsgstr[256]; time_t tim; struct tm lt; va_list argptr; va_start(argptr, szformat); vsprintf(szmsgstr, szformat, argptr); va_end(argptr); writelogmsg(szmsgstr); //my function } 例2 #include <stdarg.h> #include <iostream.h> int add_all(int num, ...) { int ret = 0; va_list vl; va_start(vl, num); while(num-- > 0) { ret += va_arg(vl, int); } va_end(vl); return ret; } void main() { int num = add_all(5, 1, 1, 1, 1, 1); cout<<num; } |
最近读者: