传统的标准C库头文件和重载的C++函数

AnT*_*AnT 5 c++ legacy standard-library

C++语言标准在D.5中

2每个C标头(每个标头都有一个表单名称)的name.h行为就好像每个由相应cname标头放置在标准库名称空间中的名称放在全局名称空间范围内.未指定是否首先在命名空间的命名空间范围(3.3.6)中声明或定义这些名称std,然后通过显式using-declarations(7.3.3)将这些名称注入到全局命名空间范围中.

3 [示例:标头<cstdlib> 确实在命名空间中提供其声明和定义std.它还可以在全局命名空间中提供这些名称.标题<stdlib.h>肯定在全局命名空间中提供相同的声明和定义,就像在C标准中一样.它还可以在命名空间中提供这些名称 std. - 末端的例子]

这似乎相当明确地说明了("......每个名字......","......相同的声明......")旧式<name.h>标题必须提供与新式标题相同的声明<cname>集,但在全局命名空间.例如,对于各种C函数的C++特定重载版本,没有例外.

这似乎意味着,<math.h>必须提供三个版本的sin功能:sin(float),sin(double)sin(long double)在全局命名空间.反过来,这意味着以下C++代码应该无法解决重载问题

#include <math.h>

int main() {
  sin(1);
}
Run Code Online (Sandbox Code Playgroud)

它在MSVC++编译器下失败,但它在GCC和Clang下成功编译.那么,GCC是否只是忽略了已弃用的旧式标题的标准要求?还是我以某种方式误解了标准中的措辞?

use*_*267 2

感谢@hvd 的评论,我看到了曙光,事实证明 MSVC 是正确的,GCC 也应该抱怨这种模糊性。

<cmath>include与 include之间的唯一区别<math.h>在于名称最初的作用域,即namespace std全局名称空间,后者为全局名称空间(实现也可以自由地提供其他名称空间中的名称,但这不是强制性的) ,并且不推荐包含.hC 标头的变体。