数学函数的命名空间是什么?全球或std
?
考虑cos功能。它有3个重载。但是math.h中还有遗留cos
。 C对函数重载一无所知。因此cos(x)
无法解析为cos(float)
。解决方案是明确调用单精度版本cosf(x)
。我错过了什么吗?
答案 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。