【发布时间】:2012-11-11 03:24:20
【问题描述】:
Java 中的“import”与 C/C++ 中的“#include”的行为方式相同吗?具体来说,它会包含它正在导入的整个库,还是只包含在后续代码中调用的类和方法?
【问题讨论】:
-
实际来源仅在链接时链接。预处理器只是替换包含原型的头文件。也请看我的回答stackoverflow.com/a/19581919/986760
Java 中的“import”与 C/C++ 中的“#include”的行为方式相同吗?具体来说,它会包含它正在导入的整个库,还是只包含在后续代码中调用的类和方法?
【问题讨论】:
取决于您实际导入的内容。最小的可导入实体是类,最大的是包。
因此,如果您需要一个类并导入完整的包,它将带入完整的包。
【讨论】:
#include 两者都不做,既不“导入”库,也不做类或模块。
#include 指令只是告诉预处理器包含另一个文本文件(源)的内容。就是这样。
预处理文件 A #includeing 文件 B 的结果就像它们是一个文件一样传递给编译器,文件 B 粘贴到文件 A 中放置 #include 指令的位置。
明确说明:这一切都发生在任何编译、代码生成之前。
作为一个副作用,C/C++ 预处理器可以独立于编译器来处理任何类型的文本文件输入。
有人可能会争辩说,像#include 这样的预处理器语句“并不是真正的 C/C++ 语言的一部分”,因为它们基本上不需要用 C/C++ 编写任何程序,因为它们永远不会传递给编译器。
表达式import 不用于(标准)C/C++ 编程的上下文中,因为没有要导入的内容。
C/C++ 模块在源代码级别在编译之前或由链接器在编译之后组合在一起。
【讨论】:
*.c 和 *.h)。
*.c和*.h)在预处理阶段被读取,以创建每个*.c文件的中间版本(将*.hs合并到*.cs其中#included它们) .然后将这些中间 源 提供给编译器以创建目标文件,然后将目标文件与所需的库(如果有)一起传递给链接器,以创建最终的可执行文件或库。
在 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/
【讨论】:
#includeing 不会在编译时发生,而是在编译之前。
import 语句和 C/C++ 的 #include 指令之间的差异的上下文中(正如 OP 所质疑的那样),我认为指出这一点并不离题说明 C/C++ 预处理器不是任何编译或代码生成的一部分,而是需要提及的基本事实。
#include 指令确实只包含一个文本文件,不管这个文件 actullay 包含什么。后者完全留给程序员,很可能包括任何类型的定义。
我认为关于 c 的其他答案可能尚未明确的一个方面是,
include in c 只在预处理阶段复制头文件 其中包含函数原型,仅此而已。实际上 函数定义仍然位于链接时,在基本代码之后 编译。
可以通过包含头文件而不是源文件并从代码中调用函数来完成简单的验证。不会有编译错误,只有在链接时它会抱怨无法找到定义。
【讨论】:
include通常指C、C++ lang,它们是平台相关的语言,需要直接编译、链接和加载到架构的机器指令集上,而import指的是java lang,它是平台无关,可以生成字节码,然后可以解释成二进制码格式。
【讨论】:
#include<stdio.h> 表示将stdio.h的内容复制到这个文件中,
而import java.util.ArrayList 表示如果您在此文件中找不到类,请查看上述导入位置。 Java 导入不会增加文件的大小,它只是节省了几次击键。
【讨论】:
import(在 Java 中)类似于 using(在 C++ 中)- 如您所知,它们并不完全相同,但非常相似。
import 是表示编译器在哪里可以找到当前类中使用的类(或子包)。
包括 - Sven 在这里解释得更好 - https://stackoverflow.com/a/3739563/135553
【讨论】:
一般来说:
在c语言中,当编译器遇到#include语句时,所有指定的头文件都会在include语句的时候被加载,而不管我们是否使用这些头文件。因此它被称为静态绑定。
但是在java语言的情况下,当编译器遇到import语句时,import语句时不会加载.class文件。在接下来的代码行中,每当我们当时使用一个类时,只会加载相应的 .class 文件。这种类型的加载称为动态加载或按需加载或动态加载。
【讨论】: