stdarg.h stdarg.h是C语言中C标准函式库的标头档,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函式能够接收不定量参数。[1] C++的cstdarg标头档中也提供这样的机能;虽然与C的标头档是相容的,但是也有冲突存在。 不定参数函式(Variadic functions)是stdarg.h内容典型的应用,虽然也可以使用在其他由不定参数函式呼叫的函式(例如,vprintf)。 宣告不定参数函式 不定参数函式的参数数量是可变动的,它使用省略号来忽略之后的参数。例如printf函式一般。代表性的宣告为: int check(int a, double b, ...); 不定参数函式最少要有一个命名的参数,所以 char *wrong(...); 在C是不被允许的(在C++中,这样的宣告是合理的)。在C,省略符号之前必须要有逗号;在C++,则没有这种强制要求。
va_list 用来指向参数 C89
stdarg.h巨集名称 描述 相容
va_start 使va_list指向起始的参数 C89
va_arg 检索参数 C89
va_end 释放va_list C89
va_copy 拷贝va_list的内容 va_copy(va2, va1)意思为拷贝va1到va2。
eg:
例子
va_arg 自己要访问参数,例如一个函数,它取任意数量的int 参数,并把它打印出来
#include <stdio.h>
#include <stdarg.h>
void printargs(int arg1, ...) /* 输出所有int型态的参数,直到-1结束 */
{ va_list ap;
int i;
va_start(ap, arg1);
for (i = arg1; i != -1; i = va_arg(ap, int)) //或者不用某个结束标志,用下面的去代替这个for循环
//int temp;
//for(i=0;i<arg1;i++){
//temp=va_arg(ap,int);
//printf("%d",temp);
//}
printf("%d ", i);
va_end(ap);
putchar('\n'); }
int main(void)
{ printargs(5, 2, 14, 84, 97, 15, 24, 48, -1);
printargs(84, 51, -1);
printargs(-1);
printargs(1, -1); return 0;
}
这个程式产生输出: 5 2 14 84 97 15 24 48 84 51 1
又如:c++中假设要编写一个快速的调式函数,如果设置了调式标志,则将字符串打印到stderr中,否则,什么也不做。
#include<cstdio>
注意:后面的省略号(...)表示任意类型和任意个数的参数,c规定可变长函数的第一个,必须是命名参数,c++没有这样规定
va_list ap ; 声明va_list 变量
va_start 初始化va_list变量,带二个参数,第一个是ap,第二个必须是参数列表最右边的命名参数,所以函数都必须要一个命名参数
va_end 结束对变长参数列表的访问