如果参数的数量未知,如何遍历va_list?

如果附加参数的数量未知,我如何遍历va_list?

#include  #include  int add(int x, int y, ...) { va_list intargs; int temp = 0; va_start(intargs, y); int i; for (i = 0; i < 3; i++) { /* How can I loop through any number of args? */ temp += va_arg(intargs, int); } va_end(intargs); return temp + x + y; } int main() { printf("The total is %d.\n", add(1, 2, 3, 4, 5)); return 0; } 

使用sentinel值作为终止符,例如NULL-1

在使用可变长度参数列表时,必须以某种方式指示参数的数量(如果您正在编写可移植代码)。 您现在可能正在考虑“但是printf并不要求您指出一些论点!”

是的,但是可以通过首先解析%格式说明符的格式字符串来推断出数字。

您可能希望执行诸如将参数数量作为第一个参数传递的操作。

例如,请参见: http : //www.cplusplus.com/reference/clibrary/cstdarg/va_start/

这里有更多讨论: http : //www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/

变量参数可能是危险的,所以如果可能的话我会尽量避免它们。 传递包含大小和指向元素数组的指针的“向量”类型将更安全。

您使用第一个参数来指示元素的数量,然后,您可以将任意数量的元素传递给该函数。

这是一个典型的电话:

 int i = add(5, 20, 30, 40, 50, 60); 

共有5个数字,因此第一个参数为5 。 然后剩下的就是要加起来的5个数字。

该函数将是:

 int add(int argc, ...) { int result = 0; va_list ptr; va_start(ptr, argc); for (int i = 0; i < argc; i++) { result += va_arg(ptr, int); } return result; } 

参考文献:

在va_arg()

的va_start()

va_list的()