【问题标题】:'import' in Java vs. '#include' in C/C++Java 中的“导入”与 C/C++ 中的“#include”
【发布时间】:2012-11-11 03:24:20
【问题描述】:

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

【问题讨论】:

标签: java c++ c import include


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    #include 两者都不做,既不“导入”库,也不做类或模块。

    #include 指令只是告诉预处理器包含另一个文本文件(源)的内容。就是这样。

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

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

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

    有人可能会争辩说,像#include 这样的预处理器语句“并不是真正的 C/C++ 语言的一部分”,因为它们基本上不需要用 C/C++ 编写任何程序,因为它们永远不会传递给编译器。

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

    C/C++ 模块在源代码级别编译之前或由链接器编译之后组合在一起。

    【讨论】:

    • 这是一个很好的解释整体+1。不过有几点。预处理器不只复制包含函数原型的头文件,并且在链接时包含实际的源文件吗?以上听起来像是预处理器粘贴了实际来源,我认为事实并非如此。我要问的另一点是,如果在 java 中导入不同,到底会发生什么?编译器会自己执行这种添加包吗?
    • @fayyazkl:链接器处理编译结果。在此构建阶段不再涉及源(*.c*.h)。
    • @fayyazkl:关于 Java 的导入是如何工作的,你可能想在这里阅读:stackoverflow.com/questions/12620369/how-java-import-works
    • 是的,这是正确的,因此包含的现有头文件是预编译的。因此,目标文件仅在链接时链接。如果它们没有被编译,那应该作为编译阶段的一部分来完成。在预处理器阶段再次没有引用源代码,这是我的观点。
    • @fayyazkl:“...在预处理器阶段没有对源代码的引用...”胡?源(*.c*.h)在预处理阶段被读取,以创建每个*.c文件的中间版本(将*.hs合并到*.cs其中#included它们) .然后将这些中间 提供给编译器以创建目标文件,然后将目标文件与所需的库(如果有)一起传递给链接器,以创建最终的可执行文件或库。
    【解决方案3】:

    在 Java 中,当您使用 import 时,您可以导入:

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

    【讨论】:

      【解决方案4】:

      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 不会在编译时发生,而是在编译之前
      • 我不想详细了解 C/C++ 编译器如何处理源代码,这完全是题外话。你同意吗?评论仍然是公平的,所以+1。
      • 在查找 Java 的 import 语句和 C/C++ 的 #include 指令之间的差异的上下文中(正如 OP 所质疑的那样),我认为指出这一点并不离题说明 C/C++ 预处理器不是任何编译或代码生成的一部分,而是需要提及的基本事实。
      • 无论如何,+1 提到经典 C/C++ 方法可能即将发生的变化,至少对于 C++ 而言。
      • @fayyazkl:#include 指令确实只包含一个文本文件,不管这个文件 actullay 包含什么。后者完全留给程序员,很可能包括任何类型的定义。
      【解决方案5】:

      我认为关于 c 的其他答案可能尚未明确的一个方面是,

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

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

      【讨论】:

        【解决方案6】:

        include通常指C、C++ lang,它们是平台相关的语言,需要直接编译、链接和加载到架构的机器指令集上,而import指的是java lang,它是平台无关,可以生成字节码,然后可以解释成二进制码格式。

        【讨论】:

        • 问题不是“C/C+”与“Java”。
        【解决方案7】:

        #include<stdio.h> 表示将stdio.h的内容复制到这个文件中, 而import java.util.ArrayList 表示如果您在此文件中找不到类,请查看上述导入位置。 Java 导入不会增加文件的大小,它只是节省了几次击键。

        【讨论】:

        • 谢谢。这就是我要找的。​​span>
        【解决方案8】:

        import(在 Java 中)类似于 using(在 C++ 中)- 如您所知,它们并不完全相同,但非常相似。

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

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

        【讨论】:

          【解决方案9】:

          一般来说:

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

          但是在java语言的情况下,当编译器遇到import语句时,import语句时不会加载.class文件。在接下来的代码行中,每当我们当时使用一个类时,只会加载相应的 .class 文件。这种类型的加载称为动态加载或按需加载或动态加载。

          【讨论】:

          • "在 c 语言中,当编译器遇到#include 语句"时,会发生纯文本替换。这与任何“绑定”完全无关,如果完成,则在预处理、编译之后由链接器完成。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-15
          • 1970-01-01
          • 2011-01-30
          • 2023-02-11
          • 2012-09-01
          • 2013-01-07
          • 1970-01-01
          相关资源
          最近更新 更多