问题描述
是否有任何 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