什么是“使用命名空间 std;”,为什么我需要它来编译具有最新C++编译器的程序
What is `using namespace std;`, and why do I need it to compile programs with recent C++ compilers?
最近C++using namespace std;
是什么?
在 Turbo C++ 等旧编译器中,这似乎不受支持,因为它会导致编译器错误。在最近的C++编译器中,这是编译和运行程序的唯一方法。
>C++使用"命名空间"对相关的类和函数进行分组。 C++标准库几乎完全在名为 std
("标准"的缩写)的命名空间中定义。 当您#include
标准标头(如 <string>
)时,它包含如下定义:
namespace std
{
template<typename T>
class allocator;
template<typename Ch>
class char_traits
{
// ...
};
template<typename Ch, typename Traits = char_traits<Ch>, typename Alloc = allcoator<Ch>>
class basic_string
{
// ...
};
typedef basic_string<char, char_traits<char>, allocator<char> > string;
}
名称 allocator
、char_traits
、basic_string
和 string
都是在命名空间std
中声明的,所以在包含该标头后,您需要将它们称为 std::string
等。
或者,您可以使用 using 指令(例如 using namespace std
),它使命名空间中的所有名称std
在当前范围内可用,因此在 using-指令之后,您可以只说 string
而不是 std::string
。
古老的 TurboC++ 编译器不遵循标准,因此它的标准库只是将名称放在全局命名空间中,因此您必须引用string
而不是std::string
并且不能使用 using-指令。 第一个C++标准发布于 1998 年,因此您不应该在 2013 年使用预标准编译器,这不会是有价值的教育。
Turbo C++ 是一个 20+ 岁的编译器。你不应该使用它。
可是
#include <iostream>
using namespace std;
在现代编译器中与在 Turbo C 中为标准标头编写以下内容相同。
#include <iostream.h>
Turbo C++ 是预命名空间。所以所有标准标头都不在namespace std
.所以你不需要使用namespace std
.
在 Turbo C++ 中,您永远不需要using namespace std
,因为它不支持命名空间。Turbo C++ 不支持大约 50% 的C++东西 - 它太旧了。使用 Visual C++(Express 版本是免费的)或 G++ for C++。
using namespace std;
告诉编译器,你不关心标准库中精心设计的std
的使用,而是自己处理不可预测的,有时甚至是灾难性的名称冲突。
不要使用它。它永远不是必需的,即使某些 IDE 会自动插入它。如果您有其中之一,请在声明发生时将其删除。
要使用标准库中的名称,请使用 std::
进行限定。喜欢这个:
#include <iostream>
int main() {
std::cout << "Hello, worldn";
}