【问题标题】:How to initialize a va_list object in c++?如何在 C++ 中初始化 va_list 对象?
【发布时间】:2020-03-08 13:26:16
【问题描述】:

这越来越烦人了

我尝试解决这个问题已经够久了,但我不得不问你如何解决这个问题,因为我已经没有任何想法了。

#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 参数不能有引用类型并且不能用括号括起来。请帮忙

【问题讨论】:

  • 这能回答你的问题吗? How do I fill a va_list
  • 主要问题是您调用add 函数时使用了两个整数 值。更具体地说,两个 int 值。我不知道sizeof(int) == sizeof(double) 所在的任何系统,这意味着您将在add 函数中具有未定义的行为
  • 不可复制,list 在此处使用之前已初始化(或者更确切地说已填充)。 va_end(liste); 中有一个错字,传递的参数类型与提取的值不匹配。

标签: c++ initialization declaration


【解决方案1】:

在您的版本中,您应该首先将参数的数量作为整数值传递,然后传递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);
}

这是一个类型安全的解决方案,即使您将 ints 和 doubles 混合使用也可以:

#include <iostream>

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多