3

我试图在编译时确定_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 整数类型 <stdint.h>,4)。浮动类型也一样吗?

UPD20211117:

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

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

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

4

2 回答 2

0

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

编译一个使用_Float16. 如果它编译,则意味着它被支持。

于 2022-01-14T20:09:53.480 回答
0

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

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

于 2022-01-26T17:49:57.333 回答