传统的标准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
变体的事实已被弃用。
上一篇: Legacy standard C library headers and overloaded C++ functions