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

Pav*_*kin 5 c floating-point gcc clang half-precision-float

我试图在编译时确定_Float16受支持的:

#define __STDC_WANT_IEC_60559_TYPES_EXT__
#include <float.h>
#ifdef FLT16_MAX
_Float16 f16;
#endif
Run Code Online (Sandbox Code Playgroud)

调用:

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

在这里我们看到 gcc 和 clang:

  • 定义FLT16_MAX
  • 不支持_Float16

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

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

UPD20211117:

  1. 不调用 gcc-pedantic会导致警告消失。并_Float16得到支持。伟大的!
  2. 调用 clang w/o-pedantic不会导致错误消失。可能这是一个错误。

感谢用户n。1.8e9-我的份额在哪里 m。为了这个想法。

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

Pav*_*kin 1

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

额外:使用相同的原理来确定类型的支持:检查是否定义了stdint.h关联的宏。MIN / MAX