va_list必须是函数声明中的最后一个参数吗?



看似简单的问题,但一直未能在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_startva_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)


  1. 允许创建指向va_list和的指针将该指针传递给另一个函数,在这种情况下函数之后,原函数可以进一步使用原列表

如上所述,可以将va_list或指向va_list的指针传递给函数,并且没有提到将其限制为最后一个参数。

相关内容

  • 没有找到相关文章

最新更新