c++ - 变量参数列表 : use va_list or address of formal parameter?

标签 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 有何用意?

最佳答案

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

只有在您的平台上函数的参数以特定方式放置在堆栈上时,第二个版本才有效。可变参数的使用将其抽象化,这使得第一个版本具有可移植性。

关于c++ - 变量参数列表 : use va_list or address of formal parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18336602/

相关文章:

c++ - readv(), writev(), WSARecv(), WSASend()

c++ - 当我尝试用 makefile 编译我的 qt 程序时它不起作用

list - 批量docker注册表 list 删除: How to list manifests via v2 REST api?

python - 如何根据python中另一个列表中的元素过滤列表

java - <> 在 Java 中做什么?

arrays - Angular 2 pipe - 计算对象数组的摘要

mysql - SQL AVG 和 SUM GROUP BY

c++ - OS X 'heap' 命令行实用程序如何收集其信息?

c++ - 编译器如何处理 SSE(或任何)内部函数?

sql-server - SUM() 比 SQL 中的 SELECT() 花费的时间更少。怎么运行的?