快速业务通道

c/c++支持可变参数的函数

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
   。。。//代码
}

这种形式不需要提供任何普通的形式参数。type是函数返回值的类型。va_dcl是对函数原型声明中参数va_alist的详细声明,实际是一个宏定义。根据平台的不同,va_dcl的定义稍有不同。

在varargs.h中,va_dcl的定义后面已经包括了一个分号。因此函数实现的时候,va_dcl后不再需要加上分号了。

3、采用头文件stdarg.h编写的程序是符合ANSI标准的,可以在各种操作系统和硬件上运行;而采用头文件varargs.h的方式仅仅是为了与以前的程序兼容,两种方式的基本原理是一致的,只是在语法形式上有一些细微的区别。 所以一般编程的时候使用stdarg.h.下面的所有例子代码都采用ANSI标准格式。

四、可变参数函数的基本使用方法

下面通过若干例子,说明如何实现可变参数函数的定义和调用。

//================================ 例子程序1 ===============
#i nclude < stdio.h >
#i nclude < string.h >
#i nclude < stdarg.h >

/* 函数原型声明,至少需要一个确定的参数,注意括号内的省略号 */
int demo( char *, ... );

void main( void )
{
demo("DEMO", "This", "is", "a", "demo!", "\0");
}

int demo( char *msg, ... )
{
va_list argp; /* 定义保存函数参数的结构 */
int argno = 0; /* 纪录参数个数 */
char *para; /* 存放取出的字符串参数 */

// 使用宏va_start, 使argp指向传入的第一个可选参数,
// 注意 msg是参数表中最后一个确定的参数,并非参数表中第一个参数
va_start( argp, msg );

    while (1)
{
//取出当前的参数,类型为char *
//如果不给出正确的类型,将得到错误的参数
para = va_arg( argp, char *);

 if ( strcmp( para, "\0") == 0 ) /* 采用空串指示参数输入结束 */
   break;
printf("参数 #%d 是: %s\n", argno, para);
     argno++;
    }
va_end( argp ); /* 将argp置为NULL */
    return 0;
}

//输出结果
参数 #0 是: This
参数 #1 是: is
参数 #2 是: a
参数 #3 是: demo!

注意到上面的例子没有使用第一个参数,下面的例子将使用所有参数

//================================ 例子程序2 ===============

#i nclude <stdio.h>
#i nclude <stdarg.h>
int average( int first, ... ); //输入若干整数,求它们的平均值

void main( void )
{
   /* 调用3个整数(-1表示结尾) */
   printf( "Average is: %d\n", average(2,3,4, -1));

   /*调用4个整数*/
   printf( "Average is: %d\n", average(5,7,9, 11,-1));

   /*只有结束符的调用*/
   printf( "Average is: %d\n", average(-1) );
}

/* 返回若干整数平均值的函数 */
int average( int first, ... )
{
   int count = 0, sum = 0, i = first;
   va_list marker;

   va_start( marker, first ); //初始化
   while( i != -1 )
   {
      sum += i; //先加第一个参数
      count++;
      i = va_arg( marker, int);//取下一个参数
   }
   va_end( marker );
   return( sum ? (sum / count) : 0 );
}

//输出结果
Average is: 3
Average is: 8
Average is: 0

五、关于可变参数的传递问题

有人问到这个问题,假如我定义了一个可变参数函数,在这个函数内部又要调用其它可变参数函数,那么如何传递参数呢?上面的例子都是使用宏va_arg逐个把参数提取出来使用,能否不提取,直接把它们传递给另外的函数呢?

我们先看printf的实现:

int __cdecl printf (const char *format, ...)
{
va_list ar

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号