首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmath标头混淆

cmath标头混淆
EN

Stack Overflow用户
提问于 2011-06-02 21:52:35
回答 4查看 2.7K关注 0票数 4

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

考虑一下cos函数。它有3个重载。但也有来自math.h的遗留cos。C对函数重载一无所知。因此,不能将cos(x)解析为cos(float)。解决方案是显式地调用单精度版本cosf(x)。我错过什么了吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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名称空间中定义的符号,也可能提供了在全局名称空间中定义的符号。

票数 4
EN

Stack Overflow用户

发布于 2011-06-02 21:56:29

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

票数 3
EN

Stack Overflow用户

发布于 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头,它会同时放在两个名称空间中(在标准的两次迭代中)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6215467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档