繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM