使用命名空间std

Rya*_*yan 2 c++ namespaces header std visual-c++

我正在学校上课,我想开始在课堂上做一些c ++编程.我的学校使用Microsoft Visual C++ 6.0(从1998年开始),所以它仍然使用<iostream.h>而不是<iostream>using namespace std.当我开始工作时,我无法弄清楚如何以及何时使用using namespace std以及何时只使用std::cout<<"Hello World!"<<'\n';(例如)以及它的限制和命名空间关键字的其他用途.特别是,如果我想用iostream和iomanip创建一个程序,我是否必须两次声明"使用命名空间std",或者是否有一些我必须使用的东西,或者我可以做同样的事情我和iostream一起做过吗?我试过谷歌搜索它,但我真的不明白.在此先感谢您的帮助.

riw*_*alk 11

好的,那里的一些东西,但它是可管理的.

首先,区别:

using namespace std;
...
cout << "Something" << endl;
Run Code Online (Sandbox Code Playgroud)

并使用

std::cout << "Something" << std::endl;
Run Code Online (Sandbox Code Playgroud)

只是范围问题.范围只是说明编译器如何识别变量和函数名称等的一种奇特方式.命名空间只是在该命名空间中的所有变量上添加一个额外的范围层.键入时using namespace std,您将占用命名空间内的所有内容std并将其移至全局范围,以便您可以使用较短的cout而不是更完全限定的std::cout.

关于名称空间的一个理解是它们跨文件.无论<iostream><iomanip>使用的命名空间std.因此,如果同时包含两者,则声明using namespace std将对两个文件进行操作,并且两个文件中的所有符号都将移动到程序的全局范围(或​​函数的作用域,如果在函数内使用它).

会有人告诉你"不要使用using namespace std!!!!",但他们很少告诉你原因.让我们说我有以下程序,我想要做的就是定义两个整数并打印出来:

#include <iostream>

using namespace std;

int main(int argc, char** argv) {
    int cout = 0;
    int endl = 1;
    cout << cout << endl << endl;     // The compiler WILL freak out at this :)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我使用时using namespace std,我正在为命名碰撞打开大门.如果我(通过随机机会),将变量命名为与标题中定义的变量相同,那么您的程序将会中断,并且您将很难找出原因.

我可以通过不使用语句编写与以前相同的程序(但让它工作)using namespace std:

#include <iostream>

int main(int argc, char** argv) {
    int cout = 0;
    int endl = 1;
    std::cout << cout << endl << std::endl; // Compiler is happy, so I'm happy :)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

希望这澄清了一些事情.