您的位置:首页 > 其它

如何实现类似printf( const char *format [, argument]... )这种参数不固定的函数

2011-06-27 15:34 495 查看
Example
/* VA.C: The program below illustrates passing a variable
* number of arguments using the following macros:
*      va_start            va_arg              va_end
*      va_list             va_dcl (UNIX only)
*/

#include <stdio.h>
#define ANSI            /* Comment out for UNIX version     */
#ifdef ANSI             /* ANSI compatible version          */
#include <stdarg.h>
int average( int first, ... );
#else                   /* UNIX compatible version          */
#include <varargs.h>
int average( va_list );
#endif

void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d/n", average( 2, 3, 4, -1 ) );

/* Call with 4 integers. */
printf( "Average is: %d/n", average( 5, 7, 9, 11, -1 ) );

/* Call with just -1 terminator. */
printf( "Average is: %d/n", average( -1 ) );
}

/* Returns the average of a variable list of integers. */
#ifdef ANSI             /* ANSI compatible version    */
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;

va_start( marker, first );     /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker );              /* Reset variable arguments.      */
return( sum ? (sum / count) : 0 );
}
#else       /* UNIX compatible version must use old-style definition.  */
int average( va_alist )
va_dcl
{
int i, count, sum;
va_list marker;

va_start( marker );            /* Initialize variable arguments. */
for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )
sum += i;
va_end( marker );              /* Reset variable arguments.      */
return( sum ? (sum / count) : 0 );
}
#endif

Output
Average is: 3
Average is: 8
Average is: 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: