2011-01-26 65 views
10

如果附加参数的数量未知,我该如何循环访问va_list? 如果参数数量未知,如何遍历va_list?

#include <stdio.h> 
#include <stdarg.h> 

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; 
} 
+0

您可能需要在最后一个NULL并寻找。 –

+0

谢谢,这实际上是我现在采取的方法。我认为这比在通话开始时使用一个arg计数器更简单。最后放置一个NULL更容易。 – Bob

回答

14

用一个标记值作为终结,e.g NULL-1

+1

如果你想添加0或负数? 'va_arg(intargs,int)'会将NULL转换为0. –

+0

示例:http://www.cplusplus.com/reference/cstdarg/va_end/ – dlchambers

2

您可能想要做的事情就像传递参数的数量作为第一个参数。

E.g.在这里看到: http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

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

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

+0

谢谢,我正在使用ANSI C,我不认为有任何其他方法可以避免这种情况。 – Bob

+0

@Bob:传递一个int *和数组的大小。最后,NULL的问题在某种程度上有人会忘记它,它可能很难调试错误。 –

17

您必须注明参数的数量以某种方式使用可变长度参数列表时(如果你正在写可移植的代码)。你现在可能会想:“但是printf并不需要你指出一些参数!”

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