【问题标题】:What is the relationship between iostream and namespace std?iostream和命名空间std有什么关系?
【发布时间】:2014-05-11 06:28:28
【问题描述】:

我目前正在使用21 天自学 C++,第二版一书来学习 C++ 编码以及 Microsoft Visual C++ 2010 Express。在第 1 章的最后,有一个关于编写和编译以下代码的小练习:

#include <iostream>

int main ()
{
    cout << "Hello World!\n";
    return 0;
}

很简单,对吧?然而令我惊讶的是,由于这个错误,代码无法编译:

错误 C2065:“cout”:未声明的标识符

我开始在网上搜索,很快找到了一些解决方案here。原来我不得不添加 using namespace std; 我的代码!

但是书中没有提到命名空间,所以我认为这本书已经过时了。 (它使用 #include &lt;iostream.h&gt; 预处理器指令!)在进行了更多的 Web 研究后,我发现了很多关于名称空间的信息,namespace std,以及一些关于 &lt;iostream.h&gt;&lt;iostream&gt; 的历史背景,以及所有这些新的流程信息让我很困惑。 (更不用说所有关于医学 STD 的不必要的 Google 结果......)

到目前为止,我有一些问题:

  1. 如果我包含iostream 库,为什么需要namespace 才能找到cout?是否有另一个cout 可能导致名称冲突?如果有人可以为此提供图表,那就太好了。

另外,还有一些历史背景:

  1. iostream.h 在更改为 iostream 之前究竟是什么?

  2. namespace 是否参与了这一变化?

【问题讨论】:

  • 您不必将using namespace std; 添加到您的代码中。你必须在main 中说std::coutusing std::cout;
  • 但是为什么需要std 部分呢? iostream里面有几个couts吗?
  • 因为coutstd 命名空间内。

标签: c++ c++11 namespaces


【解决方案1】:

所有标准库定义都在命名空间 std 中。也就是说,它们不是在全局范围内定义的,因此要使用它们,您需要通过以下方式之一来限定它们:

  • std::cout
  • using namespace std
  • using std::cout

举个例子:

// declarations
int global_variable;

namespace n {
int variable2;
}

global_variable 可以直接访问:

int x;
x = global_variable;

但是variable2不是全局空间的一部分,而是namespace n的一部分。

int x;
x = variable2; // error variable2 identifier not found.

所以你必须使用全名:

int x;
x = n::variable2;

你可以写一个快捷方式:

using namespace n;
int x;
x = variable2; // variable2 is searched in current namespace
               // and in all namespaces brought in with using namespace
               // Found ONLY in namespace n -> OK

using n::variable2; // this makes any unqualified reference to `variable2`
                    // to be resolved to `n::variable2`
int x;
x = variable2;

至于头文件,iostream.h 在没有标准之前被许多编译器使用。当委员会试图标准化时,他们决定使 C++ 标头无扩展名,以免破坏与现有代码的兼容性。

【讨论】:

    【解决方案2】:

    因为此行以# 开头,所以称为“预处理器指令”。预处理器 在编译之前读取您的程序,并且只执行以# 开头的那些行。预处理器为编译器设置你的源代码。

    #include 指令使预处理器将另一个文件的内容包含到程序中。 iostream 文件包含允许 C++ 程序将输出显示到屏幕并从键盘获取输入的代码。 iostream 文件在出现#include 指令时包含在程序中。 iostream 称为头文件,出现在程序的顶部或头部。

    using namespace std;

    C++ 使用命名空间来组织名称或程序实体。它声明该程序将评估属于namespace 的一部分的实体,称为“std”。 iostream 文件创建的每个名称都是 namespace 的一部分。

    【讨论】:

      【解决方案3】:

      1.如果我包含iostream 库,为什么需要namespace 才能找到cout?是否还有另一个cout 可能导致名称冲突?

      这是必需的,因为 C++ 标准要求 cout 位于 std 命名空间内。 可能有冲突的cout,但不在标准库中(例如,您自己的代码或某些第三方库。)

      1.iostream.h在改成iostream之前到底是什么?

      它可以是任何东西,因为它不是标准的一部分,但它是构成iostream 基础的预标准化标头的名称。通常,它在全局命名空间中声明所有名称,因此您正在查看的示例很可能是预先标准化编写的。

      2.namespace 是否参与了这一变化?

      这个问题不清楚。关键字namespace 可以在实现内部使用,它用于在命名空间内声明和定义数据、函数、类型等。所以它确实有一些部分参与了这个变化。

      namespace foo
      {
        void bar();  // declares foo::bar
      }
      

      【讨论】:

      • 这是必需的,因为 C++ 标准要求 coutstd namespace 内。可能存在冲突的cout,但不在标准库中(例如,您自己的代码或某些第三方库。) cout 如何保留在 std 命名空间中? cout的整个实现或定义?
      【解决方案4】:

      在 C++ 中,您可以在逻辑上将标识符分组为 namespacescout 流位于命名空间 std 内。您可以通过 3 种方式使用它。

      1. 在顶部写上using namespace std,并像以前一样使用cout
      2. 在顶部写上using std::cout,并像以前一样使用cout
      3. 使用std::cout 而不是cout

      【讨论】:

        【解决方案5】:

        感谢@bolov ..了解引用此standard 的要点,这是声明:

        #include <ios>
        #include <streambuf>
        #include <istream>
        #include <ostream>
        
        namespace std 
        {
            extern istream cin;
            extern ostream cout;
            extern ostream cerr;
            extern ostream clog;
        
            extern wistream wcin;
            extern wostream wcout;
            extern wostream wcerr;
            extern wostream wclog;
        }
        
        

        【讨论】:

        • 使用三个反引号 (```) 创建一个代码块。对齐您的代码以使其更具可读性。解释为什么标准使用自己的命名空间(std):因为这样用户代码可以在全局命名空间中拥有自己的同名设施,并且名称不会与标准头文件的名称冲突。跨度>
        【解决方案6】:

        包含了新版本的 c++ 命名空间。 iostream 包含输入和输出的所有声明。命名空间 std 用于告诉我们正在使用 cout 和 cin,它们是 std 命名空间的一部分。您可以在自己的命名空间中创建自己的名为 cout 和 cin 的变量。

        【讨论】:

          【解决方案7】:

          我和你有同样的问题。我只是用外行的方式教你。

          想象一下,您需要一支放在卧室抽屉里的铅笔。所以你需要进入你的房间才能拿到你的铅笔。这里的房间是 iostream。进入房间后,您需要打开抽屉并取用铅笔。这里的抽屉是namespace,铅笔是cin/cout

          参考:-https://en.wikiversity.org/wiki/C%2B%2B/Introduction

          【讨论】:

            猜你喜欢
            • 2020-12-16
            • 1970-01-01
            • 2020-07-27
            • 1970-01-01
            • 2014-11-23
            • 2014-02-25
            • 2015-06-10
            • 1970-01-01
            • 2013-05-10
            相关资源
            最近更新 更多