我有一个variadic函数,它接受一个float参数。为什么不起作用?
va_arg(arg, float)
答案 0 :(得分:39)
在传递给可变参数函数之前,与...
对应的函数的参数是提升。 char
和short
被提升为int
,float
被提升为double
等。
6.5.2.2.7函数原型声明符中的省略号表示法导致 参数类型转换在最后声明的参数后停止。默认参数 促销是在尾随参数上进行的。
原因是早期版本的C没有功能原型;参数类型在功能站点声明,但在呼叫站点未知。但是不同的类型以不同的方式表示,并且传递的参数的表示必须与被调用函数的期望相匹配。因此可以使用int参数将char和short值传递给函数,或者可以将float值传递给具有double参数的函数,编译器将“较小的类型”提升为较大的类型。当在调用站点不知道参数的类型时,仍然会看到这种行为 - 即,对于可变参数函数或没有原型声明的函数(例如,int foo();
)。
答案 1 :(得分:10)
正如@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