什么加载到标准命名空间?

时间:2016-07-25 11:05:15

标签: c++ namespaces

我目前正在构建我的第一个更复杂的C ++程序,它包含一个自己的命名空间。当然,我使用了几种进口。我发现奇怪的是,功能包含在例如。

#include <math.h>

可以在工作区内访问

a = cos(b)

其中cos函数是math.h的一部分。另一方面,功能包括例如

#include <fstream>

必须通过

加入
std::ifstream

或类似的。我想了解这个

1 个答案:

答案 0 :(得分:4)

C ++标准库包含大部分C库(C库的可选部分周围有一些模糊的细节)。

由于C没有命名空间的概念,因此C库中包含的所有内容都将位于全局命名空间中。由于<math.h>是一个C头,因此将其函数放入全局命名空间。

当您包含std::标题时,C ++标准库中包含的所有内容都将位于std::ifstream命名空间中,例如<fstream>

它变得有趣,是别名。例如,<math.h>也可以包含在<cmath>中。这背后的想法是你选择是否要在全局命名空间(包括<math.h>)或std::命名空间(包括<cmath>)中使用C符号,但这并不是一般来说,如果你包含标题的C ++版本(即<cmath>),你将获得两者。

通常情况下,如果标题可以通过<foo.h><cfoo>包含,则可以是C标头。 C ++标准库头文件没有这些别名(除非你必须处理某些平台上显然仍然存在的iostream.h等非标准内容)。