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

标签 c++

在 C# 中,仅对命名空间使用 using 指令。在 C++ 中,如下面的示例所示,必须执行包含然后使用命名空间,为什么它与 C# 中的不同?

#include <iostream>

int main()
{
   using namespace std;
   cout << "Hello world!" << endl;
   return 0;
}

最佳答案

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

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

长版-

C++

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

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

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

C#

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

C# 没有中间步骤的翻译单元。它只生产组件。

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

两者

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

然后你可以这样做:

std::cout << "test1\n";
cout << "test2\n";

或者

System.Console.WriteLine("test1");
Console.WriteLine("test1");

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

using Ser = System.Runtime.Serialization;

...

class Blah : Ser.ISerializable {

或别名类型:

using ISer = System.Runtime.Serialization.ISerializable;

...

class Blee : ISer {

关于c++ - 为什么在 C++ 中我需要在已经使用 import 指令之后使用命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4114431/

相关文章:

c++ - 在 C++ 中包装 stdint 变量的基础和继承对象

C++在分配值时对char *指针进行预增量与后增量

c++ - 为什么这个函数不分解这个输入字符串?

c++ - 使用 var_arg 为函数调用传递参数

c++ - 使用模板类型名的指针初始化

c++ - 在 C++ 中重载运算符

c++ - 如何解决 GCC 与标准库包含路径的混淆

c++ - GSSAPI 获取用户名密码和构建凭证不适用于非登录用户

C++ 对重载函数的模糊调用

c++ - std::map 没有父指针?