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

Is there any C compiler which defines both __STDC__ and __STDC_IEC_559__ to 1?

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

如果有,那是哪一个?

问题原因:据我测试(2021 年 4 月),none 最新版本的流行 C 编译器(gcc、clang、msvc)同时定义了 __STDC____STDC_IEC_559__ 到 1。因此,这些编译器可能会生成可执行文件,从而产生不符合 IEEE 754 的结果。但是,需要这样的 C 编译器,它实际上提供了生成的可执行文件产生符合 IEEE 754 的结果的保证/信心(在 strict 浮点模型选项下)。

是的。事实证明,在 gcc 和 clang 中 __STDC_IEC_559__ 的定义取决于主机 OS。在 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

UPD20211229:英特尔 C 编译器将 __STDC____STDC_IEC_559__ 定义为 1:

icc -std=c11 -fp-model=strict