为什么 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() 函数是一个 variadicvararg 函数;一个接受可变数量的参数。 cppreference.com中printf()函数的定义方式如下:

int printf( const char *format, ... );

...表示这个函数可以接受可变数量的参数。

variadic函数中,如果传递给float类型的变量,它会自动将其转换为double值;从类型 float 到类型 double 隐式 转换已完成。

在您的代码中,您将浮点型变量 value 作为 "%f\n" 参数之外的附加参数传递给 printf()。因此,由于 printf() 是一个 vararg 函数,它将 value 转换为 double 类型,然后再将其作为参数传递。根据您保留编译器警告的程度,它会向您发出该警告。

希望对您有所帮助!