为什么C++标准没有提到__STDC_IEC_559__?

12
根据C++11标准[c.math],<cmath>头文件与标准C库的头文件<math.h>相同。(当然,有一些区别,例如命名空间、重载等可以在此忽略。)根据C99标准附录F,“定义了__STDC_IEC_559__的实现应符合附录F中的规定。”
例如,如果两个参数都为零,则atan2可能会导致域错误,但是如果定义了__STDC_IEC_559__,则不应该出现这种情况。
在C99中,许多行为也取决于是否定义了__STDC_IEC_559__
然而,似乎在C++11标准中没有提到__STDC_IEC_559__。那么,C++实现是否应符合附录F中的规定呢?
我认为std::numeric_limits<T> ::is_iec559()是一个替代方案,但它似乎只涉及类型。

3
我认为你会发现这是因为 C++ 标准在运行库方面并没有完全重新定义 C 标准,而是通过引用包含它们,因此他们不必引用 C 标准中引用的每一项。 - user207421
1个回答

4
C++标准(n3797)通过引用包括了C标准库,参见s1.2/2。
ISO/IEC 9899:1999和ISO/IEC 9899:1999/Cor.1:2001和ISO/IEC 9899:1999/Cor.2:2003的第7条款所描述的库以下简称为C标准库。在第18到30条款和C.4中所述的条件下,C标准库是C++标准库的子集。
标准中没有提到该符号,并且我不认为它会被定义,因为它似乎是特定于标准C的。通过不定义该符号,C++不受附件F的内容约束。
相反,C++标准以更符合C++风格的形式多次提及IEC 559。例如,
对于所有is_iec559 != false的特化,应当成立。
在18.3.2.4/56中有一个具体的提及。
如果类型遵循IEC 559标准,则此处为true。218
适用于所有浮点类型。
我认为可以公正地说,C++包含了所有相同的功能(或缺乏功能),但已适应C++世界。

“一个符合规范的实现具有 is_iec559 != false”:在规范中哪里声明了这一点? - MWid
它说:“以下引用的文件对于应用本文件是不可或缺的。” 这不是引用包含。其他C宏,如__STDC_MB_MIGHT_NEQ_WC__由C ++定义。 - Potatoswatter
@Potatoswatter:C++标准包含C标准库的程度在第18到30条和附录C.4中有明确规定。对我来说,这一切似乎很清楚。 - david.pfx
@david.pfx,你的第一段听起来像在暗示C ++需要这个宏。现在我看到第二段似乎相反。但无论如何,你没有提及C ++可能如何引用Annex F。这个答案看起来令人困惑和不完整。 - Potatoswatter
C++没有义务定义该符号,我认为它可以自由地替换更符合C++风格的方法。 - david.pfx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接