我在使用va_list时遇到问题。以下代码适用于int:
main() {
int f1=1;
float** m = function(n,f1);
}
float** function(int n,...) {
va_list mem_list;
va_start(mem_list, n);
for (int i=0;i<n;i++) {
for (int j=0;j<n;j++) {
//m[i][j]=va_arg(mem_list,float);
int f = va_arg(mem_list,int);
printf("%i \n",f);
}
}
va_end(mem_list);
return NULL;
}
然而,当我改为浮动,即
float f1=1.0;
float f = va_arg(mem_list,float);
printf("%f \n",f);
它不会返回正确的值(值为0.00000)。我对发生的事情感到非常困惑。
答案 0 :(得分:8)
在varargs调用的上下文中,float
实际上已提升为double
。因此,您需要实际提取double
,而不是float
。这与%f
printf()
同时使用float
和double
的原因相同。
答案 1 :(得分:2)
由于我们在这里讨论C ++,您可能希望使用更新的C ++ 11工具。
我可以推荐可变参数模板,但它可能有点太高级,另一方面传递任意长列表现在是std::initializer_list<T>
其中T
是一个简单类型。
void function(std::initializer_list<int> list);
它没有很多功能,只是:
size()
返回列表中有多少元素begin()
以及end()
像往常一样返回迭代器所以你可以这样做:
void function(std::initializer_list<int> list) {
std::cout << "Gonna print " << list.size() << " integers:\n";
bool first = true;
for (int i: list) {
if (first) { first = false; } else { std::cout << ", "; }
std::cout << i;
}
std::cout << "\n";
}
然后将其调用为:
int main() {
function({1, 2, 3, 4, 5});
}
将打印:
Gonna print 5 integers:
1, 2, 3, 4, 5
一般来说,在C ++中,远离C-variadic。它们类型不安全且充满了陷阱。