2012-11-22 32 views
17

Java中的'import'的行爲與C/C++中的'#include'行爲相同嗎?具體來說,它會包含它正在導入的整個庫,還是隻包含後續代碼中調用的類和方法?Java中的'import'與C/C++中的'#include'

+0

實際源僅在連接時連接。預處理器只包含包含原型的頭文件。請參閱我的答案太http://stackoverflow.com/a/19581919/986760 – fayyazkl

回答

0

取決於您實際導入的內容。最小的可導入實體是類,最大的是包。
所以,如果你需要一個類和導入完整的包,它會帶來完整的包。

24

#include兩者都沒有,既不導入庫,也不導致類或模塊。

#include指令只是告訴預處理器包含另一個文本文件(源)的內容。就這樣。

將預處理文件A #include的結果傳遞給編譯器,就好像它們是一個文件一樣,並將文件B粘貼到放置#include指令的位置處的文件A中。

爲了說明這一點:這一切都發生在之前到任何編譯,代碼生成。

作爲一種副作用,C/C++預處理器可以獨立於編譯器使用,以處理任何類型的文本文件輸入。

有人可能會爭辯說像#include這樣的預處理器語句「實際上不是C/C++語言的一部分」,因爲它們不是C/C++中編寫任何程序所必需的,因爲它們從不傳遞給編譯器。

在(標準)C/C++編程的上下文中不使用表達式import,因爲沒有任何要導入的內容。

C/C++模塊之前到編譯或通過後編譯接頭放在一起或者在源的水平。

+0

這是一個很好的解釋整體+1。雖然有幾點需要說明。預處理程序不是隻複製包含函數原型的頭文件,而是在鏈接時包含實際的源文件?上面的說法聽起來像是預處理器粘貼了實際的數據源,我相信並非如此。我會問的另一點是,究竟是什麼導致在java中導入不同?編譯器是否自己執行這個包的添加? – fayyazkl

+0

@fayyazkl:鏈接器處理編譯結果。源代碼(包括'* .c'和'* .h')在構建的這個階段不再涉及。 – alk

+0

@fayyazkl:關於如何Java的導入工作,你可能想閱讀這裏:http://stackoverflow.com/questions/12620369/how-java-import-works – alk

6

在Java中,當你使用import,您導入之一:

  • 一個類:import foo.bar.Baz
  • 全包:import foo.bar.*
  • 一類的單個靜態成員:import static foo.bar.Baz.GRUT
  • 每個類的靜態成員:import static foo.bar.Baz.*
2

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/

+1

'#include'ing在編譯時不會發生,但**之前**編譯。 – alk

+0

我不想詳細介紹C/C++編譯器如何處理源代碼,這完全是無關緊要的。你同意嗎?仍然評論是公平的,所以+1。 – DejanLekic

+0

在發現Java的'import'語句和C/C++的'#include'指令(如OP所質疑的)之間的差異的情況下,我認爲這不是指出C/C++預處理器不是任何編譯或代碼生成的一部分,而是一個重要的事實。 – alk

0

我覺得一個方面,其他答案可能就c具有不清除的,

包括在C只複製中,包含了函數原型,僅此而已預處理程序階段 頭文件。在編譯基本代碼 之後,實際的 函數定義仍位於鏈接時間。

一個簡單的驗證可以通過包含一個頭文件,但不包含源文件並從您的代碼調用函數來完成。將不會有編譯錯誤,只有在鏈接時它會抱怨無法找到定義

-2

include通常指的是C,C++ lang,它們是平臺相關語言,需要被編譯,鏈接並直接加載到機器指令集的體系結構中,但當import爲java lang時,它是獨立於平臺,它可以生成字節碼,然後解釋爲二進制代碼格式。

+0

問題不是「C/C +」與「Java」。 – alk

7

#include<stdio.h>手段複製該文件stdio.h中的內容, 而import java.util.ArrayList意味着如果水溼在此文件中查找到上述導入位置找到一個類。 Java導入不會增加文件的大小,只會節省很少的擊鍵。

+1

謝謝。這就是我一直在尋找的東西。 – h8pathak

0

導入(在Java中)與使用(在C++中)類似 - 正如您所瞭解的,它們不完全相同,但非常相似。

導入是爲了指示編譯器在哪裏可以找到當前類中使用的類(或子包)。

包括 - 斯文更好地在這裏解釋它 - https://stackoverflow.com/a/3739563/135553