【发布时间】:2013-02-27 02:57:02
【问题描述】:
为什么我需要输入using namespace std; 才能使用cout 和endl?还有这些叫什么; cout 是一个函数吗?
C 中有cout 吗?我听说它是用 C++ 实现的,因为它在很多方面都更好。
【问题讨论】:
-
cout不是C库,许多人会反对它“在许多方面都更好”的观点。 :-)
为什么我需要输入using namespace std; 才能使用cout 和endl?还有这些叫什么; cout 是一个函数吗?
C 中有cout 吗?我听说它是用 C++ 实现的,因为它在很多方面都更好。
【问题讨论】:
cout 不是C 库,许多人会反对它“在许多方面都更好”的观点。 :-)
cout 是在std 命名空间中定义的全局对象,endl 是也在std 命名空间中定义的(流操纵器)函数。
如果您不采取任何措施将其名称导入全局命名空间,您将无法使用非限定标识符 cout 和 endl 来引用它们。您必须使用完全限定名称:
std::cout << "Hello, World!" << std::endl;
基本上,using namespace std 所做的是将std 命名空间中存在的所有实体名称注入到全局命名空间中:
using namespace std;
cout << "Hello, Wordl!" << endl;
但是,请记住,在全局命名空间中有这样的 using 指令是一种糟糕的编程习惯,这几乎肯定会导致邪恶的名称冲突。
如果您真的需要使用它(例如,如果您的某个函数正在使用std 命名空间中定义的许多函数,并且编写std:: 会使代码更难阅读),您应该将其范围限制在单个函数的本地范围内:
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...
}
如果可行的话,更好的是使用以下侵入性较小的使用声明,它将选择性地仅导入您指定的名称:
using std::cout;
using std::endl;
cout << "Hello, Wordl!" << endl;
【讨论】:
不!您不需要using namespace std 和you shouldn't use it。使用完全限定名称std::cout 和std::endl,或者在小范围内,
using std::cout;
using std::endl;
至于其他问题,std::cout 不是函数。它是一种绑定到标准输出的全局输出流对象。而且 C 中没有 std::cout。
【讨论】:
std命名空间,可以这样做
using namespace std;
std:: 下的所有名称,即使您知道,也无法知道将来版本的 C++ 标准库中将出现的名称。跨度>
using namespace std;
将名称集合(称为命名空间)中的名称带入当前范围。大多数教科书似乎鼓励如下使用:
#include <iostream>
using namespace std;
int main()
{
//Code which uses cout, cin, cerr, endl etc.
}
有些人不鼓励以这种方式使用它,因为当命名空间范围重叠时,您可能会与名称发生意外冲突,并鼓励您直接使用标准名称,如 std::endl
您还有其他选择,例如
a) 利用作用域规则临时引入命名空间
int main()
{
{
using namespace std;
//Code which uses things from std
}
//Code which might collide with the std namespace
}
b) 或者只带你需要的东西
using std::endl;
using std::cin;
回答你的最后一个问题 cin 是一个流对象(支持流提取和插入运算符 >> 和
【讨论】:
cout 和 endl 是 C++ 标准库的成员。如果你想在没有 using 语句的情况下使用它们,只需在命名空间前添加:
std::coutstd::endl
这可能对你有用:
http://msdn.microsoft.com/en-us/library/bzbx67e8(VS.80).aspx
cout 在 C 中不存在。
【讨论】:
通常,“使用命名空间标准”仅在小型学习项目中声明,从不在实际程序中声明。原因是您不需要将该命名空间中的所有内容都包含到您的代码中,首先因为编译器需要时间来执行此操作。 Stroustrup 自己写道,这是一种糟糕的品味。 而且它比 C 中的 printf 更好,因为它是类型安全的,并且可以轻松地为您自己的类型重载,而无需更改库类。
【讨论】: