数学函数的命名空间是什么?全局或std
考虑一下cos函数。它有3个重载。但也有来自math.h的遗留cos。C对函数重载一无所知。因此,不能将cos(x)解析为cos(float)。解决方案是显式地调用单精度版本cosf(x)。我错过什么了吗?
发布于 2011-06-02 21:58:25
通过将<math.c>和<cmath>包含在C++中,您可以获得相同的函数,唯一的区别是名称空间。也就是说,包含<math.h>也会给你带来过载。
理论上,在C++03中,使用<math.h>可以获得在全局名称空间和std名称空间中定义的符号,而使用<cmath>可以获得在std名称空间中定义而不是在全局名称空间中定义的符号。
实践是不同的,C++ 0X使理论与实践保持一致。<math.h>提供了在全局名称空间中定义的符号,可能还提供了在std名称空间中定义的符号,而使用<cmath>提供了在std名称空间中定义的符号,也可能提供了在全局名称空间中定义的符号。
发布于 2011-06-02 21:56:29
它们位于std名称空间中。但是,出于向后兼容性的原因,cmath头也使用using std::cos;在全局名称空间中显示它们。
发布于 2011-06-02 21:56:54
cXXX标头将其所有内容都放在std名称空间中。它们也可以将它们放在全局名称空间中,但这不是必需的。
这来自C++0x,即将推出的标准,D.7节:
2/每个C标头都有一个
name.h形式的名称,其行为就像由相应的cname标头放置在标准库命名空间中的每个名称都放在全局命名空间范围内一样。未指定是否首先在命名空间std的命名空间作用域(3.3.6)内声明或定义这些名称,然后通过显式使用-声明(7.3.3)将其注入全局命名空间作用域。
3/ Example:在名称空间std中,header <cstdlib>肯定提供了它的声明和定义。它还可以在全局名称空间内提供这些名称。头<stdlib.h>在全局名称空间中肯定提供了相同的声明和定义,与C标准中的声明和定义非常相似。它还可以在命名空间std中提供这些名称。-end示例
这与C++03的D.5节相同(在新标准中更明确,但效果是相同的):
2/每个C标头(每个标头都有一个
name.h形式的名称)的行为就好像由相应的cname标头放置在标准库命名空间中的每个名称也被放置在命名空间std的命名空间范围内,并且后面跟着一个显式的using-声明。
3/ Example: header <cstdlib>在名称空间std中提供其声明和定义。头<stdlib.h>使这些在全局名称空间中也可用,这与C标准中的非常相似。-end示例
如果包含'old-style‘XXX.h头,它会同时放在两个名称空间中(在标准的两次迭代中)。
https://stackoverflow.com/questions/6215467
复制相似问题