变量函数(va_arg)如何适用于float

文章讨论了C语言中可变参数函数的工作原理,特别是参数在传递过程中的提升规则。即使函数原型声明为`float`,在调用时,`float`参数会被提升为`double`。示例代码展示了`foo`函数如何通过`va_arg`从`double`类型接收参数,即使原始调用使用的是`float`。这解释了为何在示例中,`float`值在传递给函数后仍能正确以`double`形式处理。
摘要由CSDN通过智能技术生成

我有一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值