【发布时间】:2014-05-23 18:27:20
【问题描述】:
两年前我刚好遇到类似这个问题的情况:
Variadic function (va_arg) doesn't work with float?
据说问题是促进当我们调用类似的东西时float to double
va_arg(arg, float)
我的问题在这篇文章的末尾,但首先让我们看看上面链接的问题下方@Jack 的回答:
#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
现在,如果我们将 val = va_arg(vl, double) 更改为 val = va_arg(vl, float),我们将得到(至少我在 MSVS 2012 中得到):
36893488147419103000.000000
2.162500
让我们现在进入我的问题。
在本主题中:C/C++ va_list not returning arguments properly
投票最多的答案和评论说printf 也提升 float's 到double's。
但是有什么区别呢?如果两者都将float提升为double,那为什么printf会正确写入值,而va_arg却给了我们这样的鼻恶魔?
【问题讨论】:
-
是什么让你认为
printf试图解析参数,它知道会被提升为double,就像float?printf函数总是知道在float将被传递的地方期待double。你的功能没有。这就是区别。 -
感谢大家的精彩回答!现在我明白了,不仅是它是如何工作的,而且还有更多。
标签: c++ c floating-point variadic-functions