为什么不需要符合 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。
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 constant1
, intended to indicate conformance to the specifications in annex F (IEC 60559 floating-point arithmetic).
虽然从技术上讲编译器可以不定义它,但如果它确实符合 IEC 60559,那么不定义它是没有任何意义的。它是实现质量的标记,就像 __STDC__
或 __STDC_VERSION__
.
值得注意的是,此常量自 C99 以来一直存在,因此 C90 实现可能会在不定义宏常量的情况下使用 IEC 60559。