jjC ++:关于使用命名空间std和cout的问题

C++: Questions about using namespace std and cout

本问题已经有最佳答案,请猛点这里访问。

为什么我需要输入using namespace std;才能使用coutendl?还有,这些称为什么;cout是一个函数吗?

C中有cout吗?我听说它是用C++实现的,因为它在很多方面都比较好。


coutstd命名空间中定义的全局对象,endlstd命名空间中定义的(流操作器)函数。

如果不采取任何措施将其名称导入全局命名空间,则无法使用不合格的标识符coutendl引用它们。您必须使用完全限定的名称:

1
std::cout <<"Hello, World!" << std::endl;

基本上,using namespace std所做的就是将std名称空间中存在的实体的所有名称注入全局名称空间:

1
2
using namespace std;
cout <<"Hello, Wordl!" << endl;

但是,请记住,在全局命名空间中使用这样的using指令是一种糟糕的编程实践,这几乎肯定会导致恶名冲突。

如果您确实需要使用它(例如,如果您的函数使用了std名称空间中定义的许多函数,并且写入std::会使代码更难读取),则应该将其范围限制在单个函数的本地范围内:

1
2
3
4
5
6
7
void my_function_using_a_lot_of_stuff_from_std()
{
    using namespace std;
    cout <<"Hello, Wordl!" << endl;

    // Other instructions using entities from the std namespace...
}

更好的方法是,只要这是可行的,就使用以下入侵性较小的声明,这些声明将只选择性地导入您指定的名称:

1
2
3
4
using std::cout;
using std::endl;

cout <<"Hello, Wordl!" << endl;

不!你不需要using namespace std,也不应该使用它。使用完全限定名std::coutstd::endl或在小范围内使用,

1
2
using std::cout;
using std::endl;

至于其他问题,std::cout不是一个函数。它是一种绑定到标准输出的全局输出流对象。而且在C中没有一个std::cout


1
using namespace std;

将名称集合(称为命名空间)中的名称引入当前作用域。大多数教科书似乎鼓励如下使用:

1
2
3
4
5
6
7
#include <iostream>
using namespace std;

int main()
{
     //Code which uses cout, cin, cerr, endl etc.
}

有些人不鼓励以这种方式使用它,因为当命名空间范围重叠时,可能会与名称发生意外冲突,并鼓励您直接使用std::endl等完全限定的名称。

你还有其他选择,比如

a)利用作用域规则临时引入命名空间

1
2
3
4
5
6
7
8
int main()
{
     {
        using namespace std;
        //Code which uses things from std
     }
     //Code which might collide with the std namespace
}

b)或者只带上你需要的东西

1
2
using std::endl;
using std::cin;

在回答上一个问题时,cin是一个流对象(支持流提取和插入操作符的函数和数据的集合)>>和<<)


通常,"使用名称空间std"只在小型学习项目中声明,而不是在真正的程序中声明。原因是,您不需要将该名称空间中的所有内容都包含到代码中,首先是因为编译器需要时间来完成这项工作。斯特劳斯特鲁普自己写道,这是一种不好的品味。而且它比C中的printf更好,因为它是类型安全的,并且可以很容易地为您自己的类型重载,而无需更改库类。


CUT和Endl是C++中标准库的成员。如果要在不使用using语句的情况下使用它们,只需在命名空间前面加上:

std::coutstd::endl

这可能对您有用:

http://msdn.microsoft.com/en-us/library/bzbx67e8(vs.80).aspx

c中不存在cout