示例代码:
#include <stdio.h>
#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include <float.h>
#ifdef FLT16_MAX
_Float16 f16;
int main(void)
{
printf("%f\n", f16);
return 0;
}
#endif
调用:
# gcc trunk on linux on x86_64
$ gcc t0.c -std=c11 -Wall
期望的诊断结果:
<nothing>
实际诊断:
t0.c:9:14: warning: format '%f' expects argument of type 'double', but argument 2 has type '_Float16' [-Wformat=]
9 | printf("%f\n", f16);
| ~^ ~~~
| | |
| | _Float16
| double
__STDC_WANT_IEC_60559_TYPES_EXT__
如果被定义,并且 FLT16_MAX
被定义,那么 gcc 不知道 _Float16
是否可以与 printf
一起使用吗?它应该知道吗?此外:
f
是 float
类型时,printf("%f\n", f);
不会导致上述警告,尽管“格式 '%f' 期望类型为 'double' 的参数,但第二个参数的类型为 'float'”。令人困惑。
...
的float
类型将自动提升为double
类型。也许对于非标准的_Float16
类型不会发生这种情况? - HolyBlackCatprintf
的实现。它是由C库实现的,可能是glibc、newlib、musl或其他库之一。 - Keith Thompson(错误地?)
,之后:(意外地)
。 - pmor