函数的可变参数的实现

stdarg.h

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准)arguments(参数)简化而来,主要目的为让函数能够接收可变参数。C++的cstdarg头文件中也提供这样的功能;虽然与C的头文件是兼容的,但是也有冲突存在。可变参数函数(Variadicfunctions)是stdarg.h内容典型的应用,虽然也可以使用在其他由可变参数函数调用的函数(例如,vprintf)。

 

中文名  stdarg.h

类 型  头文件

相关学科 C语言

属 于 C标准函数库 可变参数函数

声明可变参数函数

可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数。例如printf函数一般。代表性的声明为:

int check(int a, double b,...);

可变参数函数最少要有一个命名的参数,所以

char *wrong(...);

在C中是不被允许的(在C++中,这样的声明是合理的)。C中,省略符号之前必须要有逗号;而在C++中,则没有这种强制要求。

 

成员

stdarg.h数据类型

类型名称        描述                                                    

va_list      用来保存宏va_arg与宏va_end所需信息        C89

stdarg.h宏

函数名称        描述         相容

va_start   使va_list指向起始的参数   C89

va_arg     检索参数        C89

va_end    释放va_list     C89

va_copy  拷贝va_list的内容        C99

访问参数

访问未命名的参数,首先必须在可变参数函数中声明va_list类型的变量。调用va_start并传入两个参数:第一个参数为va_list类型的变量,第二个为省略号前最后一个有名字的参数的名称,接着每一调用va_arg就会返回下一个参数,va_arg的第一个参数为va_list,第二个参数为返回的类型。最后va_end必须在函数返回前被va_list调用(va_list当作参数)(没有要求要读取完所有参数)。

 

C99提供额外的宏,va_copy,它能够复制va_list。而va_copy(va2, va1)函数作用为拷贝va1到va2。

Eg:

#include<iostream>

#include<assert.h>

#include<stdarg.h>

using namespace std;

void error(char const *fmt,...)

{

         assert(fmt);

         va_list p;

         va_start(p,fmt);

         for(char const *s=fmt;*s;++s)

                  if(*s!='%')

                          cerr.put(*s);

                  else

                          switch(*(++s))

                          {

                                   case '%':cerr.put('%');break;

                                   case 's':cerr<<va_arg(p,charconst*);break;

                                   case 'd':cerr<<va_arg(p,int);break;

                                   case'c':cerr<<va_arg(p,char);break;

                                   default:throwstd::domain_error(std::string("panic"));break;

                          }

         va_end(p);

}

int main()

{

         error("sls  %s   losk   %d  kosj   %c","beautiful",169,'s');

         cerr.put('\n');

         return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值