2012-11-22 12 views
17

Czy "import" w Javie zachowuje się w taki sam sposób jak "#include" w C/C++? W szczególności, czy będzie zawierał całą bibliotekę, którą importuje, czy też będzie zawierał klasy i metody, które są wywoływane w kolejnym kodzie?"importuj" w Javie kontra "#include" w C/C++

+0

Rzeczywiste źródło jest związana tylko na czas połączenia. Preprocesorowe pliki nagłówkowe zawierające tylko prototypy. Proszę zobaczyć moją odpowiedź też http://stackoverflow.com/a/19581919/986760 – fayyazkl

Odpowiedz

0

Zależy od tego, co faktycznie importujesz. Najmniejszym importowalnym podmiotem jest klasa, największa to paczka.
Jeśli więc potrzebujesz pojedynczej klasy i importujesz kompletny pakiet, otrzymasz kompletny pakiet.

24

#include nie wykonuje żadnej z nich, ani "importuje" bibliotek, ani klas ani modułów.

Dyrektywa #include nakazuje preprocesorowi zawrzeć zawartość innego pliku tekstowego (źródła). To wszystko.

Wynik pliku przetwarzania wstępnego A #include plik B jest przekazywany do kompilatora tak, jakby był jednym plikiem, z plikiem B wklejonym do pliku A w miejscu, w którym umieszczono dyrektywę #include.

Aby to wyjaśnić, należy: To wszystko się zdarza przed do dowolnej kompilacji, generowanie kodu.

Jako efekt uboczny pre-procesor C/C++ może być użyty niezależnie od kompilatora do przetworzenia dowolnego rodzaju pliku tekstowego o numerze .

Można argumentować, że pre-procesorowe instrukcje, takie jak #include "tak naprawdę nie są częścią języków C/C++", ponieważ nie są w zasadzie potrzebne do pisania jakichkolwiek programów w C/C++, ponieważ nigdy nie są przekazywane do kompilatora .

Wyrażenie import nie jest używane w kontekście (standardowego) programowania C/C++, ponieważ nic nie ma być importowane.

C/C++ moduły są połączone albo na poziomie źródłowym przed kompilacją lub przez linker po kompilacji.

+0

To dobre wytłumaczenie ogólnie +1. Kilka punktów jednak. Czy preprocesor nie kopiuje tylko plików nagłówkowych zawierających prototypy funkcji, a rzeczywiste pliki źródłowe są zawarte w czasie łącza? Powyższe sprawiają, że brzmi to jak rzeczywiste źródła są wklejane przez preprocesora, który moim zdaniem nie jest. Drugim punktem, o który pytam, jest to, co dokładnie dzieje się w przypadku, gdy import w java jest inny? czy kompilator wykonuje to samo dodanie pakietów? – fayyazkl

+0

@fayyazkl: Linker zajmuje się kompilacją. Źródła (ani '* .c' ani' * .h') nie są już zaangażowane na tym etapie kompilacji. – alk

+0

@fayyazkl: Jeśli chodzi o sposób importowania Java, możesz przeczytać tutaj: http://stackoverflow.com/questions/12620369/how-java-import-works – alk

6

W Javie, kiedy używasz import, importować albo:

  • pojedyncza klasa: import foo.bar.Baz
  • pełny pakiet: import foo.bar.*
  • pojedynczy statyczny członkiem klasy: import static foo.bar.Baz.GRUT
  • każdy statyczny element klasy: import static foo.bar.Baz.*
2

C/C++ #include Dyrektywa dzieje się w fazie wstępnego przetwarzania i zwykłym angielskim oznacza "w tym miejscu wklej cały plik nagłówkowy (lub dowolny plik tekstowy, jeśli chcesz), który jest podany jako parametr". Nowy standard C++ będzie miał moduły (ostatecznie) i może, ale nie musi, być podobny do importu Javy (w zależności od tego, jak będzie on wdrażany). Więcej informacji na temat tej propozycji C++: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3347.pdf

Java 8 ma również ulepszoną obsługę programowania modułowego.Zobacz: http://openjdk.java.net/projects/jigsaw/

+1

'' include'ing nie wydarzyło się w czasie kompilacji, ale ** przed ** kompilacją. – alk

+0

Nie chciałem do szczegółów, w jaki sposób kompilator C/C++ przetwarza źródło, które byłoby całkowicie nie na temat. Czy sie zgadzasz? Wciąż komentarz jest sprawiedliwy, więc +1. – DejanLekic

+0

W kontekście znajdowania różnicy między "' '' '' '' '' '' '' '' '' '#'' (w pytaniu OP), nie sądzę, że nie jest to tematem zwracającym uwagę, że C/C++ preprocesor nie jest częścią żadnej kompilacji ani generowania kodu, ale jest to istotny fakt, o którym warto wspomnieć. – alk

0

myślę jeden aspekt, że inne odpowiedzi mogą nie ureguluje w sprawie C jest

obejmują wc tylko kopiuje plik nagłówka w fazie preprocesora który zawiera prototyp funkcji, nic więcej. Rzeczywista definicja funkcji nadal znajduje się w czasie łącza, po podstawowym kompilacji kodu .

Prostą weryfikację można wykonać, dołączając plik nagłówkowy, ale nie plik źródłowy i wywołując funkcję z kodu. Nie będzie błędu kompilacji i tylko w czasie połączenia będzie narzekać, że nie będzie w stanie zlokalizować definicji.

-2

zawierają zwykle C, C++ lang, gdzie są językami zależnymi od platformy i muszą być skompilowane, połączone i załadowane bezpośrednio do zestawu instrukcji maszynowej architektury, ale gdzie, jak to się mówi, import odnosi się do języka java, niezależnej od platformy, gdzie może generować kod bajtowy, a następnie może zinterpretować format kodu binarnego.

+0

Pytanie to nie było "C/C +" a "Java". – alk

7

#include<stdio.h> środki skopiować zawartość stdio.h w tym pliku, podczas import java.util.ArrayList znaczy jeśli cann't znaleźć klasę w tym pliku patrzeć w wyżej wymienionym miejscu importu. Importowanie Java nie zwiększa rozmiaru pliku, po prostu zapisuje kilka naciśnięć klawiszy.

+1

Dzięki. Tego właśnie szukałem. – h8pathak

0

import (w Javie) jest podobny do używania (w C++) - Jak rozumiesz, nie są one dokładnie takie same, ale bardzo podobne.

import jest wskazaniem kompilatora, w którym może znaleźć klasę (lub pakiet podrzędny) używaną w bieżącej klasie.

obejmują - Sven wyjaśnił to lepiej tutaj - https://stackoverflow.com/a/3739563/135553

Powiązane problemy