下面的代码包含 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_start
、va_art
和 va_end
有何用意?
最佳答案
第二个版本是不可移植的,这是使用第一个版本的有力论据。
只有在您的平台上函数的参数以特定方式放置在堆栈上时,第二个版本才有效。可变参数的使用将其抽象化,这使得第一个版本具有可移植性。
关于c++ - 变量参数列表 : use va_list or address of formal parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336602/