使用运算符时获取垃圾......
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;
}
我正在尝试使用运算符“...”但遇到了麻烦:
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;
}