是否有任何 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
是否有任何 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