传统的标准C库标题和重载的C ++函数

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

2每个C头都有一个name.h形式的name.h ,就好像每个名称放置在标准库名称空间中的相应的cname头都放在全局名称空间范围内一样。 没有指定这些名称是首先在名称空间std的名称空间范围(3.3.6)中声明还是定义的,然后通过显式使用声明(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);
}

它确实在MSVC ++编译器下失败,但它在GCC和Clang下成功编译。 那么,GCC是否忽视了旧式标题的标准要求? 或者我不知何故误解了标准中的措词?


感谢@ hvd的评论,我已经看到了光明,事实证明MSVC是正确的,海湾合作委员会也应该抱怨含糊不清。

包含<cmath><math.h>之间的唯一区别是名称最初的作用域,它在前者的namespace std中,以及后者的全局名称空间(实现可自由提供其他名称空间中的名称同样,但这不是强制性的),并且包含C头文件的.h变体的事实已被弃用。

链接地址: http://www.djcxy.com/p/29769.html

上一篇: Legacy standard C library headers and overloaded C++ functions

下一篇: Does using namespace cause name hiding?