2

下面的代码包含 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_list,va_startva_art时需要注意va_end什么?

4

2 回答 2

3

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

仅当在您的平台上函数的参数以特定方式布置在堆栈上时,第二个版本才有效。可变参数的使用将其抽象化,这就是使第一个版本可移植的原因。

于 2013-08-20T13:45:22.517 回答
2

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

于 2013-08-20T13:57:05.670 回答