【问题标题】:Where in the C++11 standard is std::fmodf stated?C++11 标准在哪里声明了 std::fmodf?
【发布时间】:2021-08-11 10:05:22
【问题描述】:

根据cppref page,在 C++11 中将 std::fmodf 添加到 cmath 中。这怎么可能,因为这不意味着 cmath 会破坏与 C++11 之前的 math.h 的兼容性吗?我找不到任何说 std::fmodf 是在 C++11 中添加的引用,我想知道这是在哪里声明的。

谢谢

【问题讨论】:

  • 为什么会破坏兼容性?
  • 添加不会破坏兼容性。删除接口会。
  • @interjay 嗯,我认为你是对的。但是我在 C++11 标准中找不到对 std::fmodf 的任何引用? C++11 是否增加了对 C99 函数的支持?

标签: c++ c++11 language-lawyer c++-standard-library fmodf


【解决方案1】:

在 C++11 标准的什么地方声明了 std::fmodf?

没有直接提到它(尽管它可能应该在函数列表中提到,或者明确省略)。导致std::fmodf 存在的更改在这里(引自草案 N3337):

以下参考文件对于本文件的应用是必不可少的。对于注明日期的参考文献,仅引用的版本适用。对于未注明日期的参考文献,适用参考文件的最新版本(包括任何修订)。

  • ...
  • ISO/IEC 9899:1999,编程语言 - C
  • ...

通过以下规则:

[c.math]

这些头文件的内容分别与标准 C 库头文件 相同,但有以下变化: ...

C99 添加了 fmodf。当 C++11 开始引用 C99 的标准库而不是 C89 时,它被继承到了 C++。

请注意,“以下更改”未列出遗漏fmodf


为什么 fmodf 没有列在函数列表(26.8/3 和 26.8/9)中?它被添加到 C++17 标准的列表中。

这似乎是一个编辑错误。 P0175 似乎已经在 C++17 中修复了它,它建议:

在这篇社论论文中,我们建议在工作草案中添加 C 库头文件的完整概要,这些库头文件包含在 C++ 中,并参考了 C 标准(参见表 15)。这些概要将取代标题为“标题概要”的各种表格。


旁注:std::fmodf 在 C++ 中相当无用,因为您可以简单地使用 std::fmod 来代替,而且自 C++98 以来就一直存在。

【讨论】:

  • 为什么fmodf 没有在<cmath> 函数列表(26.8/3 和 26.8/9)中列出?它被添加到 C++17 标准的列表中。
  • 啊,谢谢,看到C99加了fmodf之类的我就想这个了。