[英]Legacy standard C library headers and overloaded C++ functions
C ++语言标准在D.5中说
2每个C标头(每个标头都具有
name.h
形式的名称)的行为就好像每个由相应的cname
标头放置在标准库命名空间中的名称放在全局命名空间范围内。 未指定是在名称空间std
的名称空间作用域(3.3.6)中首先声明或定义这些名称,然后通过显式使用声明(7.3.3)将这些名称注入全局名称空间作用域。3 [示例:标头
<cstdlib>
确定在命名空间std
提供其声明和定义。 它还可以在全局命名空间中提供这些名称。 头文件<stdlib.h>
肯定在全局命名空间中提供相同的声明和定义,就像在C标准中一样。 它还可以在命名空间std
提供这些名称。 - 末端的例子]
这似乎相当明确地说明了(“......每个名字......”,“......相同的声明......”)旧式<name.h>
标题必须提供<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是正确的,GCC也应该抱怨模糊性。
包含<cmath>
vs <math.h>
之间的唯一区别是名称最初作用域的位置,在前者的namespace std
中,以及后者的全局名称空间(实现可以在其他名称空间中自由提供名称)同样,但这不是强制性的),并且不推荐使用包含C标头的.h
变体的事实。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.