Как инициализировать объект va_list в c ++? - PullRequest
0 голосов
/ 08 марта 2020

Это раздражает

Я достаточно долго пытался это исправить, но я должен спросить вас, как это исправить, потому что у меня больше нет идей.

#include <iostream>
#include <cstdarg>

using namespace std;

void add(const int &number, ...)
{
    double sum = 0.0;
    va_list list;

    va_start(list, number);
    for (int i = 0; i < number; i++)
        sum += va_arg(list, double);

    va_end(liste);

    cout << "Sum: " << sum << endl;
}

int main()
{
    add(12, 12);
}

Это мой код Я получаю ошибку, что list не инициализирован, и я получаю ошибку, что аргумент va_start не должен иметь ссылочный тип, и он не должен быть заключен в скобки. Просьба помочь

1 Ответ

2 голосов
/ 08 марта 2020

В вашей версии вы должны сначала передать число аргументов как целочисленное значение, а затем передать double значения (поскольку вы интерпретируете их как double). Передача int и интерпретация как double, как в вашем примере, вызывает неопределенное поведение. Вот исправленная версия:

#include <iostream>
#include <cstdarg>

void add(int count, ...) 
{
    double sum = 0.0;
    std::va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i) {
        sum += va_arg(args, double);
    }
    va_end(args);

    std::cout << sum << '\n';
}

int main() 
{
    add(4, 25.0, 25.0, 25.0, 25.0);
}

Вот безопасное для типов решение, которое работает, даже если вы смешаете int с и double с:

#include <iostream>

template <typename... Args>
void add(Args... args)
{
  std::cout << (args + ...) << '\n';
}

int main()
{
    add(25.0, 25, 25.0, 25);
}
...