C++ 中可变数量的参数 [Xcode]

Variable number of arguments in C++ [Xcode]

我对 C++ 中可变数量的参数有疑问。我使用 Xcode 编写代码。

这是我的代码:

#include <iostream>

int sum(int n, ...)
{
    int *p = &n;
    p++;

    int res = 0;
    for(int i=0; i<n; i++){
        res+=(*p);
        p++;
    }

    return res;
}

int main(int argc, const char * argv[]) {

    std::cout << sum(4, 1, 2, 3, 4);

    return 0;
}

sum(4, 1, 2, 3, 4) 应该 return 值为 10,但它 returns 1606452732.

发件人:http://en.cppreference.com/w/cpp/utility/variadic/va_start

#include <iostream>
#include <cstdarg>

int add_nums(int count, ...) 
{
    int result = 0;
    va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
    va_end(args);
    return result;
}

int main() 
{
    std::cout << add_nums(4, 25, 25, 50, 50) << '\n';

    return 0;
}

在 C++ 中,您使用模板元函数来执行此操作。非常简单:

int sum(int u)
{return u;}  // Recursion-End

template<typename... Args>
int sum(int u, Args... rest)
{
    return u + sum(rest...);
}

试试看 online

然而,在我看来,有一种使用 va_startva_end 的折旧 C 方式。您需要包含 cstdarg 并且在函数调用中您需要提供参数总数。它看起来像这样:

int sum(int argnum, ...)
{
    va_list arguments;
    int i;
    int sum = 0;

    va_start(arguments, argnum); /* Needs last known character to calculate
                                    the address of the other parameters */
    for(i = 0; i < argnum; ++i)
        sum += va_arg(arguments, int); /* use next argument */

    va_end(arguments);

    return sum;
}

试试看 online