va_list是否必须是函数声明中的最后一个参数?
看似简单的问题,但一直无法在 SO 或 C 标准中找到答案。问题是 a 是否va_list必须是 C 中函数的最后一个参数(当然,假设该函数将 ava_list作为参数)。
例如,这安全吗?
int f(int a, char *b, va_list args, char *c);
还是必须是以下内容
int f(int a, char *b, char *c, va_list args);
回答
在va_list用作函数的参数方面,该类型没有什么特别之处,因为它的包含不会使其成为可变参数函数。这两个例子都是有效的。
一个实际的可变参数函数必须至少有一个命名参数并且...在最后,它需要使用va_start和va_end设置 ava_list来读取可变参数参数。
C 标准的第 7.16p3 节描述了该va_list类型:
声明的类型是
va_list其适用于由宏需要保持信息的完整的对象类型
va_start,va_arg,va_end,和va_copy。如果需要访问可变参数,则被调用函数应声明一个ap具有 type的对象(通常在本小节中称为)va_list。该对象ap可以作为参数传递给另一个函数;如果该函数调用va_arg带参数的宏,则调用函数中ap的 值ap是不确定的,应在va_end进一步引用 之前传递给宏ap。253)
- 允许创建指向 a 的指针
va_list并将该指针传递给另一个函数,在这种情况下,原始函数可以在另一个函数返回后进一步使用原始列表。
如此处所述,ava_list或指向 a 的指针va_list可以传递给函数,并且没有提及将其限制为最后一个参数。