stdarg.h是
C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数。C++的cstdarg头文件中也提供这样的功能;虽然与C的头文件是兼容的,但是也有冲突存在。
可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数。例如
printf函数一般。代表性的声明为:
访问未命名的参数,首先必须在可变参数函数中声明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。
有些C实现提供了对可变参数的扩展,允许
编译器检查适当的格式化字串及标志(sentinels)的使用。如果没有这个扩充,编译器通常无从检查传入函数的未命名参数是否为所预期的类型。因此,必须小心谨慎以确保正确性,因为不匹配的数据类型将导致未定义行为(Undefined behavior)。例如,如果传递空指针,不能仅仅写入
NULL(可能实际定义为0),还要转化为适当的指针类型。另一个考虑是未命名参数的默认的
类型提升。float将会自动的被转换成
double。同样的,比
int(整数)更小容量的参数数据类型将会被转换成int或者
unsigned int。函数所接收到的未命名参数必须提前考虑将会出现的数据类型提升。
POSIX定义所遗留下的
头文件varargs.h,它早在C标准化前就已经开始使用了且提供类似stdarg.h的功能。
MSDN明确指出这一头文件已经过时,完全被stdarg.h取代。这个头文件不属于ISO C的一部分。文件定义在单一UNIX规范的第二个版本中。