为什么不需要符合 IEC 60559 的实施来定义 __STDC_IEC_559__(到 1)?

Why isn't an IEC 60559 conformant implementation required to define __STDC_IEC_559__ (to 1)?

C (C99+) 标准要求(虽然隐含地)一个符合规范的实现来定义 __STDC__ 到 1。

但是,C 标准不需要符合 IEC 60559 的实现来定义 __STDC_IEC_559__(至 1)。

后果:

#if __STDC__ != 1
/* non-conforming implementation */
#endif

#if __STDC_IEC_559__ != 1
/* may be IEC 60559 conformant implementation */
#endif

这里我们看到这些宏的语义不一致。任何想法为什么?这可能是缺陷吗?

为什么 C 标准不需要符合 IEC 60559 的实现来定义 __STDC_IEC_559__(到 1)?

定义它符合实现自身的最大利益。 C17 6.10.8.3:

__STDC_IEC_559__ The integer constant 1, intended to indicate conformance to the specifications in annex F (IEC 60559 floating-point arithmetic).

虽然从技术上讲编译器可以不定义它,但如果它确实符合 IEC 60559,那么不定义它是没有任何意义的。它是实现质量的标记,就像 __STDC____STDC_VERSION__.

值得注意的是,此常量自 C99 以来一直存在,因此 C90 实现可能会在不定义宏常量的情况下使用 IEC 60559。