【发布时间】:2013-05-10 11:23:04
【问题描述】:
我是 C++ 的初学者,最近我被介绍到像 std 这样的命名空间。但是,如果在 iostream 头文件中定义了 cout 和 endl 之类的函数,为什么还要包含 std 命名空间呢?还是这些函数实际上是在 std 命名空间中定义的?如果是这样,那么为什么要包含 iostream 文件?
【问题讨论】:
我是 C++ 的初学者,最近我被介绍到像 std 这样的命名空间。但是,如果在 iostream 头文件中定义了 cout 和 endl 之类的函数,为什么还要包含 std 命名空间呢?还是这些函数实际上是在 std 命名空间中定义的?如果是这样,那么为什么要包含 iostream 文件?
【问题讨论】:
一个 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;
我希望这会有所帮助。命名空间就像一个存储各种标识符的地方,以避免名称冲突。 SomeScope::x 是与 AnotherScope::x 完全不同的 x 标识符。
【讨论】:
命名空间和#include 指令是不同的东西:
当您包含标头(如 iostream)时,您是在告诉预处理器处理文件的内容,就好像这些内容已出现在源程序中包含出现的位置一样。
为什么要使用包含而不是直接把代码扔在那里?
来自: http://www.cplusplus.com/forum/articles/10627/
(1) 加快编译时间。随着程序的增长,您的程序也会增长 代码,如果一切都在一个文件中,那么一切都必须是 每次您进行任何微小更改时都会完全重新编译。这可能不会 对小程序来说似乎很重要(实际上并非如此),但是当你 有一个合理大小的项目,编译时间可能需要几分钟 编译整个程序。你能想象不得不等待 每次小改动之间的间隔时间长吗?
编译/等待 8 分钟/“哦,废话,忘记分号”/编译/ 等待 8 分钟 / 调试 / 编译 / 等待 8 分钟 / 等等
(2) 它使您的代码更有条理。如果你把概念分成 特定文件时,更容易找到您要查找的代码 你想进行修改(或者只是看看它以记住如何 使用它和/或它是如何工作的)。
(3) 它允许您将接口与实现分开。如果你 不明白这是什么意思,别担心,我们会看到它在行动 贯穿整篇文章。
另一方面,命名空间允许您在一个范围内对类和函数进行分组。它们提供了一种方法来避免这些实体之间的名称冲突,而不会带来处理嵌套类的不便。
【讨论】:
using namespace std 想象为:假设编译器在代码中的某处遇到cout。如果我们没有使用namespace std,那么编译器就不会确切知道您在说哪个 cout。它可能是 you 定义的内容,也可能是 C++ 中定义的实际 cout。为了避免这种混淆,使用了命名空间。到目前为止,这似乎没有必要,但当程序变得庞大并跨越多个功能时变得至关重要。
如果您使用 using namespace std,例如,您不必使用 std::cout。 这种情况下写cout就够了。
【讨论】: