为什么 clang 3.8 警告将 float 与 %f printf 格式说明符一起使用?
Why is clang 3.8 warning on use of float with %f printf format specifier?
此代码:
#include <stdio.h>
int main(void)
{
float value = 10.10f;
printf("%f\n",value);
}
在 Ubuntu 14.04.1 上使用 clang 3.8 使用 -Weverything 选项编译得到:
clang -Weverything w-double-precision.c
w-double-precision.c:5:17: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
printf("%f\n",value);
~~~~~~ ^~~~~
1 warning generated.
printf()
函数是一个 variadic 或 vararg 函数;一个接受可变数量的参数。
cppreference.com中printf()函数的定义方式如下:
int printf( const char *format, ... );
...
表示这个函数可以接受可变数量的参数。
在variadic函数中,如果传递给float
类型的变量,它会自动将其转换为double
值;从类型 float
到类型 double
的 隐式 转换已完成。
在您的代码中,您将浮点型变量 value
作为 "%f\n"
参数之外的附加参数传递给 printf()
。因此,由于 printf()
是一个 vararg 函数,它将 value
转换为 double
类型,然后再将其作为参数传递。根据您保留编译器警告的程度,它会向您发出该警告。
希望对您有所帮助!
此代码:
#include <stdio.h>
int main(void)
{
float value = 10.10f;
printf("%f\n",value);
}
在 Ubuntu 14.04.1 上使用 clang 3.8 使用 -Weverything 选项编译得到:
clang -Weverything w-double-precision.c
w-double-precision.c:5:17: warning: implicit conversion increases floating-point precision: 'float' to 'double' [-Wdouble-promotion]
printf("%f\n",value);
~~~~~~ ^~~~~
1 warning generated.
printf()
函数是一个 variadic 或 vararg 函数;一个接受可变数量的参数。
cppreference.com中printf()函数的定义方式如下:
int printf( const char *format, ... );
...
表示这个函数可以接受可变数量的参数。
在variadic函数中,如果传递给float
类型的变量,它会自动将其转换为double
值;从类型 float
到类型 double
的 隐式 转换已完成。
在您的代码中,您将浮点型变量 value
作为 "%f\n"
参数之外的附加参数传递给 printf()
。因此,由于 printf()
是一个 vararg 函数,它将 value
转换为 double
类型,然后再将其作为参数传递。根据您保留编译器警告的程度,它会向您发出该警告。
希望对您有所帮助!