'import' 在 Java 与 C/C++ 中的'#include'

'import' in Java vs. '#include' in C/C++

本文关键字:C++ #include 中的 Java import      更新时间:2023-10-16

Java中的"import"是否与C/C++中的"#include"行为相同?具体来说,它会包括它正在导入的整个库,还是只包括在后续代码中调用的类和方法?

#include既不执行这两项操作,也不"导入"库、类或模块。

#include指令只是告诉预处理器包含另一个文本文件(源)的内容。仅此而已。

预处理文件A#include和文件B的结果被传递给编译器,就好像它们是一个文件一样,文件B在放置#include指令的位置粘贴到文件A中。

明确地说:这一切都发生在任何编译、代码生成之前。

作为副作用,C/C++预处理器可以独立于编译器来处理任何类型的文本文件输入。

有人可能会说,像#include这样的预处理器语句"实际上不是C/C++语言的一部分",因为用C/C++编写任何程序基本上都不需要它们,因为它们从未传递给编译器。

表达式import不用于(标准)C/C++编程的上下文,因为没有任何内容可导入。

C/C++模块要么在编译前的源代码级上放在一起,要么在编译后由链接器放在一起。

#include<stdio.h>表示复制此文件中stdio.h的内容,而import java.util.ArrayList意味着如果您在这个文件中找不到类,请查看上面提到的导入位置。Java导入不会增加文件的大小,只会节省一些按键。

在Java中,当您使用import时,您可以导入以下任一项:

  • 单个类:import foo.bar.Baz
  • 一个完整的包:import foo.bar.*
  • 类的单个静态成员:import static foo.bar.Baz.GRUT
  • 类的每个静态成员:import static foo.bar.Baz.*

C/C++#include指令发生在预处理阶段,在通俗英语中,它的意思是"在这个地方粘贴作为参数给定的整个头文件(或者任何文本文件,如果你喜欢的话)"。新的C++标准将有模块(最后),可能与Java的导入类似,也可能与之不相似(取决于它将如何实现)。有关此C++方案的详细信息:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3347.pdf

Java 8还将改进对模块化编程的支持。请参阅:http://openjdk.java.net/projects/jigsaw/

我认为其他答案可能没有澄清的一个方面是,

include in c仅在预处理器阶段复制头文件它包含函数原型,仅此而已。实际函数定义仍然位于链接时,在基本代码之后汇编

一个简单的验证可以通过包含头文件而不是源文件并从代码中调用函数来完成。不会有编译错误,只有在链接时它才会抱怨找不到定义

取决于实际导入的内容。最小的可导入实体是类,最大的是包
因此,如果您需要一个类并导入完整的包,它将带来完整的包。

导入(在Java中)类似于使用(在C++中)-正如你所理解的,它们并不完全相同,但非常相似。

import指示编译器在哪里可以找到当前类中使用的类(或子包)。

包括-Sven在这里解释得更好-https://stackoverflow.com/a/3739563/135553

一般而言:

在c语言中,当编译器遇到#include语句时,无论我们是否使用这些头文件,所有指定的头文件都将在include语句的时候加载。因此,它被称为静态绑定。

但在java语言的情况下,当编译器遇到导入语句时,在导入语句时不会加载.class文件。在接下来的代码行中,无论何时使用类,都只加载相应的.class文件。这种类型的装载称为动态装载或按需装载或飞行装载。

include通常指的是C、C++语言,它们是依赖于平台的语言,需要直接编译、链接和加载到体系结构的机器指令集,但其中import指的是java语言,它是独立于平台的,它可以生成字节码,然后可以解释为二进制代码格式。