C++ 变量参数列表:使用va_列表或形式参数的地址?
下面的代码包含两个函数,这两个函数都计算提供的整数值列表的总和:C++ 变量参数列表:使用va_列表或形式参数的地址?,c++,list,sum,variadic-functions,addressof,C++,List,Sum,Variadic Functions,Addressof,下面的代码包含两个函数,这两个函数都计算提供的整数值列表的总和: #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
#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
}
#包括
#包括
使用名称空间std;
整数和1(整数个值,…)
{
va_列表参数;
va_开始(参数、值的数量);
整数和=0;
for(int i=0;icout第二个版本是不可移植的,这是使用第一个版本的有力理由
只有在您的平台上,函数的参数以特定方式排列在堆栈上,第二个版本才会起作用。使用varargs将其抽象出来,这就是第一个版本可移植的原因。第二种方法假设参数如何传递给函数。不要求假设是可以满足的。这就是为什么va_list
及其伙伴存在的原因:库供应商知道参数是如何传递的,并且能够正确地实现代码。您能描述一下第二个版本在什么环境下会中断以及以什么方式中断吗?@Vadim:例如,您的第二个版本在使用g的x86_64 Linux机器上不起作用++4.6而..
版本应该是va_列表的包装器
版本,以允许转发调用(比如有多少自定义日志函数将调用转发到v*printf()
)@Vadim:第二个版本不工作,它使用C++4.8.1(gcc-4.8.1)
,但我不知道ideone的机器架构。