为什么在使用带有 %f printf 格式说明符的 float 时,clang 3.8 会发出警告?

Sco*_*ter 5 c clang compiler-warnings

这段代码:

#include <stdio.h>
int main(void)
{
  float value = 10.10f;
  printf("%f\n",value);
}
Run Code Online (Sandbox Code Playgroud)

在 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. 
Run Code Online (Sandbox Code Playgroud)

Bus*_*mer 5

printf()函数是一个可变参数可变参数函数;一个接受可变数量的参数。cppreference.com中printf()函数的定义方式如下:

int printf( const char *format, ... );
Run Code Online (Sandbox Code Playgroud)

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

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

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

希望这可以帮助!