2017-04-27 84 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