看似简单的问题,但一直未能在SO或C标准中找到答案。问题是va_list
是否必须是C中函数的最后一个参数(当然,假设该函数以va_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
设置va_list
来读取可变参数。
C标准第7.16p3节描述了va_list
类型:
声明的类型是
va_list
是适合持有的完整对象类型
va_start
,va_arg
,va_end
,和va_copy
。如果需要访问不同的参数,被调用的函数应该声明一个对象(通常为(在本款中称为ap
),类型为va_list
。对象ap
可以作为参数传递给另一个对象函数;如果该函数调用va_arg
宏参数ap
,则主叫函数中ap
的值为不确定的,并且应该在之前传递给va_end
宏任何对ap
的进一步引用。<一口>253)一口>
- 允许创建指向
va_list
和的指针将该指针传递给另一个函数,在这种情况下函数之后,原函数可以进一步使用原列表
如上所述,可以将va_list
或指向va_list
的指针传递给函数,并且没有提到将其限制为最后一个参数。