使用运算符时获取垃圾......

Getting garbage when using operator ...

我正在尝试使用运算符“...”但遇到了麻烦:

void Func(int diff, CTester* pcTester, int params ...)
{
    va_list ap;
    va_start(ap, params);
    for(int i = 0; i < params; i++) {
        int val = va_arg(ap, int);
        cout << "[" << i << "] = " << val << "\n";
        if (diff > val) {
            // some logic
        }
    }
    va_end(ap);
}

我是这样调用 Func 的:

Func(1359, pcTester, 10, 20, 30, 40);

我希望在控制台中看到 [0]=10 [1]=20 [2]=30 [3]=40 但是我打印的太多了:

[0] = 20
[1] = 30
[2] = 40
[3] = 4197568
[4] = 26221600
[5] = 0
[6] = 4196640
[7] = 4197568
[8] = 1152895024
[9] = 0

如您所见,我有 10 个打印件(而不是 4 个),第一个值 (10) 不在列表中

我做错了什么?

您的程序有未定义的行为。

您将参数 params 视为后面的参数数量,但您没有传递足够的参数。

Func(1359, pcTester, 10, 20, 30, 40); // There are only 3 arguments after 10.

您需要确保它们匹配。使用:

// 3 arguments after params
Func(1359, pcTester, 3, 20, 30, 40);

// 4 arguments after params
Func(1359, pcTester, 4, 10, 20, 30, 40);

// 10 arguments after params
Func(1359, pcTester, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110);

最好使用 C++ 可变参数模板和 std::initializer_list 将类型固定为 int

#include <iostream>
#include <initializer_list>

class CTester {};

template < typename ... Args >
void Func(int diff, CTester* pcTester, Args ... params)
{
  int i = 0;
  for(int val : std::initializer_list<int>{ params ... })
  {
    std::cout << "[" << i << "] = " << val << "\n";
    if (diff > val) {
      // some logic
    }
    ++i;
  }
}

int main()
{
  CTester * pcTester = new CTester;
  Func(1359, pcTester, 10, 20, 30, 40);
  delete pcTester;
}

Demo on ideone