【问题标题】:如果导入 iostream 为什么要使用命名空间
【发布时间】:2013-05-10 11:23:04
【问题描述】:

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

【问题讨论】:

    标签: c++ std iostream


    【解决方案1】:

    一个 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 标识符。

    【讨论】:

      【解决方案2】:

      命名空间和#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。为了避免这种混淆,使用了命名空间。到目前为止,这似乎没有必要,但当程序变得庞大并跨越多个功能时变得至关重要。
      【解决方案3】:

      如果您使用 using namespace std,例如,您不必使用 std::cout。 这种情况下写cout就够了。

      【讨论】:

        猜你喜欢
        • 2014-11-23
        • 2020-11-24
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        相关资源
        最近更新 更多