如何在编译时正确判断支持_Float16?

How to correctly determine at compile time that _Float16 is supported?

我试图在编译时确定是否支持 _Float16

#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include <float.h>
#ifdef FLT16_MAX
_Float16 f16;
#endif

调用:

# gcc trunk on linux on x86_64
$ gcc -std=c11 -pedantic -Wall -Wextra
t0.c:4:1: warning: ISO C does not support the '_Float16' type [-Wpedantic]

# clang trunk on linux on x86_64
$ clang -std=c11 -pedantic -Wall -Wextra
t0.c:4:1: error: _Float16 is not supported on this target

这里我们看到gcc和clang都是:

主要问题:如何在编译时正确判断是否支持_Float16

额外的问题:如果不支持相应的浮动类型,C11(或更新的)标准是否要求不定义 _MIN / _MAX 宏?例如,对于整数类型 (<stdint.h>) 为真:“也不应定义关联的宏”(C11, 7.20 Integer types , 4)。浮动类型也一样吗?

UPD20211117:

  1. 调用 gcc w/o -pedantic 导致警告消失。并且支持 _Float16。太棒了!
  2. 调用 clang w/o -pedantic 不会导致错误消失。应该是bug。

感谢用户n。 1.8e9-where's-my-share m.为了这个想法。

UPD20211118: gcc: -pedantic 定义了 FLT16_MAX,这是意外的(或不是?)。

How to correctly determine at compile time that _Float16 is supported?

编译一个使用_Float16的程序。如果编译通过,说明支持

_FloatN 的支持可以通过检查是否定义了关联的 MIN / MAX(和其他)宏来确定(在包含 float.h 之前加上 __STDC_WANT_IEC_60559_TYPES_EXT__)。

Extra:同样的原则用于判断类型的支持来自stdint.h:检查是否定义了关联的MIN / MAX宏。