cmath标题混乱

时间:2011-06-02 13:52:35

标签: c++

数学函数的命名空间是什么?全球或std

考虑cos功能。它有3个重载。但是math.h中还有遗留cos。 C对函数重载一无所知。因此cos(x)无法解析为cos(float)。解决方案是明确调用单精度版本cosf(x)。我错过了什么吗?

4 个答案:

答案 0 :(得分:4)

通过在C ++中包含<math.c><cmath>,您可以获得相同的功能,唯一的区别是命名空间。 I.E.包括<math.h>也会让你超载。

理论上,在C ++ 03中,使用<math.h>为您提供在全局命名空间和std命名空间中定义的符号,同时使用<cmath>为您提供在std命名空间中定义的符号,不在全局命名空间中。

实践不同,C ++ 0X将理论与实践相结合。 <math.h>为您提供在全局命名空间中定义的符号,也可能在std命名空间中使用<cmath>为您提供在std命名空间中定义的符号,也可能在全局命名空间中。

答案 1 :(得分:3)

它们位于std命名空间中。但是,出于向后兼容性原因,cmath标头还会在using std::cos;的全局命名空间中显示它们。

答案 2 :(得分:1)

cXXX标题将所有内容放在std命名空间中。 可能也将它们放在全局命名空间中,但这不是必需的。

这是来自C ++ 0x,即将出台的标准,第D.7节:

  

2 /每个C头(每个头都有一个name.h形式的名称,就好像每个由相应的cname标头放置在标准库名称空间中的名称放在全局名称空间中范围。未指定是在名称空间std的名称空间作用域(3.3.6)中首先声明或定义这些名称,然后通过显式使用声明(7.3.3)将这些名称注入全局名称空间作用域。

     

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

这与C ++ 03中的D.5部分没有变化(在较新的标准中更明确,但效果相同):

  

2 /每个C头(每个头都有一个name.h形式的名称,就好像每个由相应的cname头放在标准库命名空间中的名称也放在命名空间中命名空间std的范围,后面跟一个显式的using声明。

     

3 / [示例:标题<cstdlib>在名称空间std中提供其声明和定义。标头<stdlib.h>也可以在全局命名空间中使用它们,就像在C标准中一样。 - 例子]

如果你包含'旧式'XXX.h标题,它会被放置在两个名称空间中(在标准的两个迭代中)。

答案 3 :(得分:0)

如果您使用的是C ++,则可以依赖函数重载。

有三种版本的cos:

double cos (      double x );
float cos (       float x );
long double cos ( long double x );

但是如果你只使用C或者你想要portabilty,那么只有这个名字的双重版本存在。浮点函数是cosf。