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