变量函数(va_arg)不适用于float?

我有一个variadic函数,它接受一个float参数。 为什么不起作用?

va_arg(arg, float) 

...对应的函数的参数在传递给可变参数函数之前被提升charshort被提升为intfloat被提升为double等。

6.5.2.2.7函数原型声明符中的省略号表示法导致参数类型转换在最后声明的参数之后停止。 默认参数提升是在尾随参数上执行的。

原因是C的早期版本没有函数原型; 参数类型在function站点声明,但在呼叫站点未知。 但是不同的类型以不同的方式表示,并且传递的参数的表示必须与被调用函数的期望相匹配。 因此可以使用int参数将char和short值传递给函数,或者可以将float值传递给具有double参数的函数,编译器将较小的类型“提升”为较大的类型。 当在调用站点不知道参数的类型时,仍然会看到这种行为 – 即,对于可变参数函数或没有原型声明的函数(例如, int foo(); )。

正如@dasblinkenlight所提到的, float被提升为double 。 这对我来说可以:

 #include  #include  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