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

时间:2012-06-30 00:45:29

标签: c floating-point variadic-functions

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

va_arg(arg, float)

2 个答案:

答案 0 :(得分:39)

在传递给可变参数函数之前,与...对应的函数的参数是提升charshort被提升为intfloat被提升为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