是否有任何 C 编译器将 __STDC__ 和 __STDC_IEC_559__ 定义为 1?

问题描述

是否有任何 C 编译器将 __STDC____STDC_IEC_559__ 都定义为 1?

如果是,那么是哪一个

问题的原因:据我所知(2021 年 4 月),流行的 C 编译器(gcc、clang、msvc)的最新版本都没有将 __STDC____STDC_IEC_559__ 定义为 1 . 因此,这些编译器可能会生成可执行文件,从而产生不符合 IEEE 754 的结果。然而,对这样的 C 编译器有需求,它实际上提供了生成的可执行文件产生符合 IEEE 754 的结果的保证/信心(在 strict 浮点模型选项下)。

解决方法

是的。事实证明,在 gcc 和 clang 中 __STDC_IEC_559__ 的定义取决于主机操作系统。对于 Windows:__STDC_IEC_559__0。对于 Linux:__STDC_IEC_559__1

以下是将 __STDC____STDC_IEC_559__ 定义为 1 的选项:

clang -std=c11 -ffp-model=strict
gcc -std=c11 -frounding-math -fsignaling-nans