我们在使用“using namespace std”时为什么要使用“#include <iostream>”?

时间:2017-02-14 18:17:59

标签: c++

我在谷歌搜索过这个问题。我在stackoverflow.comquora.com中找到了一些相关问题,但我仍然不清楚这两个主题。每个人都说我们使用#include<iostream>进行输入/输出操作。现在,我们使用cin获取输入并使用cout打印输出,这意味着应在#include<iostream>中定义这两个。但是如果不使用using namespace std,我们仍然无法接受任何输入,也无法在控制台上打印。所以,我的问题是 -

  1. cincout实际声明和定义在哪里?是#include<iostream>还是namespace std
  2. 如果在#include<iostream>,我们为什么要使用using namespace std
  3. 如果在namespace std,我们为什么要使用#include<iostream
  4. 在网上阅读了一些文章并在YouTube上观看了一些视频后,我假设cout cinnamespace std定义了namespace std#include<iostream>没有因为它是在document.getElementById("name").innerHTML = name ; 中定义的,所以没有任何意义。这就是为什么我们需要同时使用它们。 (只是我的想法,如果我是对的,请告诉我。)

    这个问题的目的是要明确这两个事实。如果你能提供帮助就会很棒。

5 个答案:

答案 0 :(得分:3)

cincout在标头iostream和名称空间std中定义。这些概念是正交的。 iostream是文件名,std是该文件源代码使用的命名空间。

作为一种保持组织有序的方式,c ++提供了命名空间。所有标准库都在名为std的名称空间中定义。您可能编写或包含的其他库可能使用自己的命名空间。例如,您可能在项目中包含一个想要定义代数向量概念的物理库。通过使用它自己的命名空间(让我们调用physlib),它可以区分vectorphyslib::vector)和标准vectorstd::vector)。命名空间也可以嵌套以帮助组织大型项目。例如,标准库的计时部分位于std::chrono,文件系统相关组件位于std::filesystem

使用cincout的首选方式如下。 :

#include <iostream>

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

语句using namespace std只是默认情况下查找名称空间std的指令。它允许您省略使用标准库组件的std::部分。它通常被视为a bad idea使用using namespace std

答案 1 :(得分:2)

  

我们为什么要使用(define-syntax-parser infix #:literals [+ *] #:datum-literals [^] [(_ n:number) #'n] [(_ x:id) #'x] [(_ (a:expr (~seq + b:expr) ...+)) #'(+ (infix a) (infix b) ...)] [(_ (a:expr (~seq * b:expr) ...+)) #'(* (infix a) (infix b) ...)] [(_ (a:expr ^ b:expr)) #'(expt (infix a) (infix b))]) (define (f x) (infix (2 * x))) (define (p x) (infix ((3 * (x ^ 2)) + (6 * x) + 5)))

将标准库的I / O功能引入我们的程序。

  

我们正在使用#include <iostream>

这使我们可以在不用每次写using namespace std的情况下使用该功能。

这与上一步无关。仅写入std::不会将I / O功能带入您的程序,只写using namespace std不允许我们使用该功能没有完整地写出其组件的名称(包括#include <iostream>前缀)。

  • std::指令决定了我们可以使用的内容;
  • #include声明决定了我们如何使用它。

非常好:

using namespace

同样有效:

#include <iostream>

int main()
{
   std::cout << "Hello world!\n";
}

无效:

#include <iostream>

using namespace std;

int main()
{
   cout << "Hello world!\n";
}

这两个都不是:

int main()
{
   std::cout << "Hello world!\n";
}

或者这个:

using namespace std;

int main()
{
   std::cout << "Hello world!\n";
}

答案 2 :(得分:1)

  
      
  1. cincout实际声明和定义在哪里?是#include<iostream>还是namespace std
  2.   

不是cincoutiostream内的namespace std标头文件中声明。

  
      
  1. 如果在#include< iostream>,我们为什么要使用using namespace std
  2.   

你不应该。完全限定全局变量,例如std::cinstd::cout。您不应该使用using namespace std;(至少在头文件中)的原因有很多。

  
      
  1. 如果在namespace std,我们为什么要使用#include<iostream>?
  2.   

因为您需要声明来编译代码。

答案 3 :(得分:1)

#include <iostrem>告诉编译器提取标题iostream的内容。该标题除其他外还提供了对象std::cinstd::cout的声明。所以基本的“Hello,world”程序如下所示:

#include <iostream>
int main() {
    std::cout << "Hello, world\n";
    return 0;
}

同样,如果您想使用std::vector,请通过#include <vector>告诉编译器。对于标准库的其余部分也是如此:无论您想要使用什么,请找出哪个标头声明它并#include标题库。

using namespace std;没有为您定义任何名称。它告诉编译器假装在std发生的范围内也定义了在命名空间using namespace std;中定义的任何名称。这意味着您可以编写std::cout而不是编写cout,编译器会发现您的意思是std::cout。当然,除非您自己使用名称cout(或std中的任何其他名称并在您#include d的标题中声明的名称)编写了一些内容,其中使用声明的情况使得名称的使用不明确。写using namespace std;是没有充分理由的。只需使用正确的名称即可:std::cout清晰且明确。

答案 4 :(得分:0)

namespace std{ // code about cin extern ostream cin; // code about cout extern ostream cout; } 是标准库的一部分,这里是&#34; iostream.h&#34;如果你自己实现它,文件会是这样的:

cin

(见documentation

  

实际声明和定义的cout#include <iostream>在哪里?是namespace std还是cin

因此cout / namespace std被声明并在标准库中定义 void main() { std::cout << "Hello"; } 。这意味着如果您想在代码中使用它,您可以这样做:

#include<iostream>
  

如果在using namespace std,我们为什么要使用using namespace std

你不需要std::cout,你可以在任何地方调用using namespace std而不是cout,但是你可以看到这会让你的代码变得冗长而烦人。 您的整个文件中using std::cout; using std::cin; 实际上是不鼓励的,因为它可能会产生意想不到的效果,通常只能使用

std:cout

需要的地方。

需要使用的原因(或明确编写#include <iostream> namespace mycoolnamespace { class foo { public: foo& operator<< (const std::string& echo) { // do stuff } }; foo cout; // created a variable called cout } void main() { cout << "Hello"; // ^^^^ compiler can't know if you meant to use std::cout or mycoolnamespace::cout here! // Potential fix: std::cout << "Hello" } 的需要),假设您有以下代码:

namespace std
  

如果在#include<iostream>,我们为什么要使用#include<iostream>

默认情况下,并非标准库中的所有函数/类都包含在您的程序中,否则就是一个简单的“Hello Hello&#34;程序会给编译器带来很多工作,因为它需要解析整个标准库中的所有现有类/函数。 iostream告诉编译器您需要标准库中可用的函数/类whse&#39;文件&#39;