2017-04-27 54 views
-1

我试图使用操作符“......”,但得到的烦恼:获取垃圾...

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(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 

正如你所看到的我有e 10打印(而不是4)并且第一个值(10)不在列表中

我在做什么错?

+1

你做'对于int i = 0;我

+0

代码中的'...'不是运算符(操作符在其他表达式上运算以产生另一个表达式,例如' +'可以在'2'和'3'上运行给出'5')。 '...'实际上是函数参数列表语法的一部分,它表明将会有未初始化的参数跟在 –

回答

2

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

您正在将参数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); 
+1

之后,您没有回答他的问题。在你的例子中,他希望看到第一个值(10) – 2017-04-27 03:14:21

+0

@Boom,现在已经更正了。 –

1

更好地利用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