如何在编译时正确判断支持_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都是:
- 定义
FLT16_MAX
- 不支持
_Float16
主要问题:如何在编译时正确判断是否支持_Float16
?
额外的问题:如果不支持相应的浮动类型,C11(或更新的)标准是否要求不定义 _MIN
/ _MAX
宏?例如,对于整数类型 (<stdint.h>
) 为真:“也不应定义关联的宏”(C11, 7.20 Integer types , 4)。浮动类型也一样吗?
UPD20211117:
- 调用 gcc w/o
-pedantic
导致警告消失。并且支持 _Float16
。太棒了!
- 调用 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
宏。
我试图在编译时确定是否支持 _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都是:
- 定义
FLT16_MAX
- 不支持
_Float16
主要问题:如何在编译时正确判断是否支持_Float16
?
额外的问题:如果不支持相应的浮动类型,C11(或更新的)标准是否要求不定义 _MIN
/ _MAX
宏?例如,对于整数类型 (<stdint.h>
) 为真:“也不应定义关联的宏”(C11, 7.20 Integer types
UPD20211117:
- 调用 gcc w/o
-pedantic
导致警告消失。并且支持_Float16
。太棒了! - 调用 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
宏。