![](/img/trans.png)
[英]Variadic function (va_arg) doesn't work with float, while printf does? What the difference is?
[英]Variadic function (va_arg) doesn't work with float?
我有一个variadic函数,它接受一个float参数。 为什么不起作用?
va_arg(arg, float)
与...
对应的函数的参数在传递给可变参数函数之前被提升 。 char
和short
被提升为int
, float
被提升为double
等。
6.5.2.2.7函数原型声明符中的省略号表示法导致参数类型转换在最后声明的参数之后停止。 默认参数提升是在尾随参数上执行的。
原因是C的早期版本没有函数原型; 参数类型在功能站点声明,但在呼叫站点未知。 但是不同的类型以不同的方式表示,并且传递的参数的表示必须与被调用函数的期望相匹配。 因此,char和short值可以传递给具有int参数的函数,或者float值可以传递给具有double参数的函数,编译器将“较小的类型”提升为较大的类型。 当在调用站点不知道参数的类型时,仍然会看到这种行为 - 即,对于可变参数函数或没有原型声明的函数(例如, int foo();
)。
正如@dasblinkenlight所提到的, float被提升为double 。 这对我来说可以:
#include <stdio.h>
#include <stdarg.h>
void foo(int n, ...)
{
va_list vl;
va_start(vl, n);
int c;
double val;
for(c = 0; c < n; c++) {
val = va_arg(vl, double);
printf("%f\n", val);
}
va_end(vl);
}
int main(void)
{
foo(2, 3.3f, 4.4f);
return 0;
}
输出:
3.300000
4.400000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.