变量参数列表:使用va_list或形式参数的地址?

时间:2013-08-20 13:41:31

标签: c++ list sum variadic-functions addressof

下面的代码包含2个函数,它们都计算所提供的整数值列表的总和:

#include <iostream>
#include <stdarg.h>

using namespace std;

int sum_1 ( int number_of_values, ... )
{
    va_list arguments;
    va_start ( arguments, number_of_values );
    int sum = 0;
    for ( int i = 0; i < number_of_values; i++ )
    {
        sum += va_arg ( arguments, int );
    }
    va_end ( arguments );

    return sum;
}

int sum_2 ( int number_of_values ...)
{
    int sum = 0;
    for ( int i = 0; i < number_of_values; i++ )
        sum += *( &number_of_values + i + 1 );
    return sum;
}


int main()
{
    cout << sum_1(3, 1, 2, 3) << endl; //prints 6
    cout << sum_2(3, 1, 2, 3) << endl; //prints 6
}

sum_1使用va_list方法,sum_2使用提供的number_of_values变量的地址相对于其找到其他值并添加它们。

那么这两种方法有什么区别?哪一个使用?第二个看起来更短,所以需要谨慎定义va_listva_startva_artva_end

2 个答案:

答案 0 :(得分:3)

第二个版本是不可移植的,这是使用第一个版本的强有力的论据。

第二个版本仅在您的平台上以函数的参数以特定方式布局在堆栈上时才有效。 varargs的使用抽象了,这使得第一个版本可以移植。

答案 1 :(得分:2)

第二种方法假设参数如何传递给函数。不要求满足这些假设。这就是为什么va_list及其伙伴存在的原因:库供应商知道如何传递参数,并且可以正确地实现代码。