C/C++ va_list 未正确返回参数
C/C++ va_list not returning arguments properly
我在使用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)。我对正在发生的事情感到非常困惑。
在 varargs 调用的上下文中,float
实际上被提升为 double
。因此,您需要实际拉出double
,而不是float
。 这与%f
for printf()
适用于float
和double
的原因相同。
由于我们在这里谈论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变频。它们类型不安全,并且充满了陷阱。
相关文章:
- 函数作为模板参数,是否对返回类型强制约束
- 子例程,不使用 pow,并带有参数和返回
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 在 c++ 中将函数返回类型指定为模板参数
- 如果返回 -1,时间() 的参数是否被修改?
- 在返回参数列表中C++局部变量(如CodeFights所示)
- is_invocable_r忽略返回参数
- C 功能参数中的返回参数
- 如何在 gmock 中返回参数之一
- 为什么 istream 类的运算符<<在 C++ 中具有引用的返回/参数类型?
- 如果返回参数,是否可以复制省略
- 避免通过引用返回参数
- C/C++ va_list 未正确返回参数
- 返回参数C++的函数
- 为什么在返回参数时不允许RVO
- 如何在createprocess结束后从exe返回参数
- 是否有可能编写一个函数模板来返回参数的数量是否能被N整除?
- 提振.Python多个返回参数
- 伊利德返回参数
- 返回参数的Typename查找