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;
}