变量参数
va_start,va_arg,va_end 和 va_copy 函数实际上是宏。
一定要始终调用 va_start 第一,也是唯一一次,并最后一次通话 va_end,只有一次,在功能上的每一个出口点。不这样做可能会对你的系统起作用,但肯定不是可移植的,因此会引发错误。
注意正确地声明你的函数,即使用原型,并注意对最后一个非变量参数的限制 (不是 register,不是函数或数组类型)。声明只接受可变参数的函数是不可能的,因为至少需要一个非变量参数才能启动参数处理。
调用 va_arg 时,必须请求提升的参数类型,即:
short被提升为int(unsigned short也被提升为int,除非sizeof(unsigned short) == sizeof(int),在这种情况下它被提升为unsigned int)。float晋升为double。signed char晋升为int;unsigned char也被提升为int,除非sizeof(unsigned char) == sizeof(int),这种情况很少发生。char通常被提升为int。- 像
uint8_t或int16_t这样的 C99 类型同样被推广。
历史(即 K&R)可变参数处理在 <varargs.h> 中声明,但不应该使用,因为它已经过时了。标准的可变参数处理(在此描述并在 <stdarg.h> 中声明)在 C89 中引入; va_copy 宏是在 C99 中引入的,但在此之前由许多编译器提供。