除非我累了,否则我不会理解以下警告。我不确定编译器基于什么(它是 MPLAB X 6,使用 Microchip 的 XC16 作为 dsPIC33 微控制器)。
float test=5.5;
printf("%f\n", test);
warning: format '%f' expects type 'double', but argument 2 has type 'float'
通常
%f
代表 float,%lf
代表 double,对吧? %hf
不存在,那么我怎样才能让这个警告消失而不做printf("%f\n", (double)test)
这是一个编译器错误。 MPLAB 编译器因 C 标准合规性极差而臭名昭著。在 Microchip 论坛上,有很多非常旧的帖子报告了同样的问题(example example)。
如评论中所述,
printf
是一个可变参数函数,传递给它的所有参数都受到所谓“默认参数升级”的影响,在这种情况下,这意味着传递的float
将always隐式提升为double
当传递到 printf
时。
因此,由于这些强制的默认参数提升,无论您尝试什么,您都无法传递
float
。因此,C 标准甚至没有提及 float
,例如 C17 7.21.6.1 §8:
f,F
争论...double
与您的问题无关,您已经在这里混合了
float
和double
:float test=5.5;
。 5.5
常量的类型为 double
- 5.5f
给出 float
。
由于 C 的各种微妙的隐式提升规则,您应该养成永远不要在同一表达式中混合
float
、double
或整数操作数的习惯。