如果导入 iostream,为什么要使用命名空间

Bbv*_*ghe 2 c++ iostream std

我是 C++ 的初学者,最近向我介绍了 std 之类的命名空间。但是,如果像 cout 和 endl 这样的函数是在 iostream 头文件中定义的,为什么还要包含 std 命名空间呢?或者这些函数实际上是在 std 命名空间中定义的吗?如果是这样,那么为什么要包含 iostream 文件?

Ang*_*llo 7

命名空间和 #include 指令是不同的东西:

当您包含标头(如 iostream)时,您是在告诉预处理器处理文件的内容,就好像这些内容已出现在包含出现的位置处的源程序中一样。

为什么要使用包含而不是直接将代码扔在那里?

来自: http: //www.cplusplus.com/forum/articles/10627/

(1) 加快编译速度。随着程序的增长,代码也会增长,如果所有内容都在一个文件中,那么每次进行任何微小的更改时都必须完全重新编译所有内容。对于小程序来说,这似乎不是什么大问题(事实并非如此),但是当您有一个合理大小的项目时,编译整个程序可能需要几分钟的时间。您能想象每次细微更改之间都要等待那么长时间吗?

编译/等待8分钟/“哦糟糕,忘了分号”/编译/等待8分钟/调试/编译/等待8分钟/等等

(2) 它让你的代码更有条理。如果您将概念分成特定的文件,那么当您想要进行修改时,更容易找到您正在寻找的代码(或者只是查看它以记住如何使用它和/或它是如何工作的)。

(3)它允许您将接口与实现分开。如果您不明白这意味着什么,请不要担心,我们将在本文中看到它的实际应用。

另一方面,命名空间允许您在某个范围内对类和函数进行分组。它们提供了一种方法来避免这些实体之间的名称冲突,而不会带来处理嵌套类的不便。


Ran*_*aul 5

一个 C++ 文件内部可以有一个命名空间,不同的 C++ 文件内部可以有相同的命名空间。

// Header1.h
namespace SomeScope
{
  extern int x;
}

// Header2.h
namespace SomeScope
{
  extern int y;
}

// Some CPP file
#include "Header1.h" // access to x
SomeScope::x = 5;

#include "Header2.h" // access to y
SomeScope::y = 6;
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。命名空间就像一个存储各种标识符的地方,以避免名称冲突。SomeScope::x是一个完全不同的x标识符AnotherScope::x