为什么在C++中我需要在使用import指令后使用命名空间?

use*_*291 1 c++

在C#中,只对命名空间使用using指令.在下面这个例子中的C++中,必须要做一个include然后使用命名空间,为什么它不像C#中那样?

#include <iostream>

int main()
{
   using namespace std;
   cout << "Hello world!" << endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mer*_*ham 7

因为C#中的编译器与C++的工作方式非常不同.

快速版本 - C#以(模糊)类似的方式使用引用,因为C++使用链接器和转发声明.C++需要前向声明,因此它可以将每个源文件编译为转换单元,然后将所有这些单元链接在一起.C#编译器加载引用程序集的代码,然后立即编译整个程序集,因此不需要那些类型的前向声明.

长版 -

C++

在C++中,如果要使用代码,则必须将其添加到链接器,并提供前向声明.头文件包含前向声明,包含文件只是将该文件复制/粘贴到源文件中.

这是因为C++有一个称为翻译单元的中间步骤,并生成目标文件.链接器粘在一起.

在您的示例中,#include <iostream>提供前向声明,并通过包含头文件(以前称为"iostream.h",但现在称为"iostream")来实现.此头文件被复制/粘贴到源代码中(以及文件包含的所有头文件,等等).这一切都被编译成一个翻译单元(目标文件),链接到C++运行时(以及可能是C运行时,可能还有其他),并转换为可执行文件.

C#

在C#中,如果要使用代码,则添加对项目或构建文件的引用,或者只是将C#文件添加到同一项目中.不需要前向声明,但您必须引用代码,或者在当前程序集中包含代码的另一个源文件.

C#中间没有翻译单元.它只生产组件.

当您引用System.dll时,您已经拥有了可用的代码.您不必提供前向声明,因此不需要包含任何标头.

您可以使用using关键字将整个命名空间拉入当前范围.在C++中,您可以调用using namespace std;.在C#中,您调用using System;

然后你可以做以下事情:

std::cout << "test1\n";
cout << "test2\n";
Run Code Online (Sandbox Code Playgroud)

要么

System.Console.WriteLine("test1");
Console.WriteLine("test1");
Run Code Online (Sandbox Code Playgroud)

我忘记你是否可以在C++中,但在C#中你也可以别名命名空间:

using Ser = System.Runtime.Serialization;

...

class Blah : Ser.ISerializable {
Run Code Online (Sandbox Code Playgroud)

或别名类型:

using ISer = System.Runtime.Serialization.ISerializable;

...

class Blee : ISer {
Run Code Online (Sandbox Code Playgroud)