2011-08-10 16 views
14

Pracuję głównie w Javie, a ostatnio próbuję się nauczyć programowania aplikacji Objective-C na Maca i iOS. Teraz ten język jest zupełnie inny od tego, do czego jestem przyzwyczajony, wskaźników, wiadomości itp., Ale wydaje mi się, że wszystko jest w porządku. Nie jest to problem z kodowaniem na słowo, ale wolałbym raczej znać to, z czym mam do czynienia, niż tylko wiedzieć "tak musi być, ponieważ tak właśnie jest".Dlaczego Objective-C używa plików nagłówkowych zamiast klas jednego pliku, takich jak Java?

Dlaczego pliki w języku Objective-C wymagają plików nagłówkowych? Jaki jest ich rzeczywisty cel oddzielenia od pliku .m? Dlaczego funkcje muszą być zadeklarowane w nagłówku, a nie tylko zaimplementowane? Czy jest to jedna z tych rzeczy, które po prostu nie wymarły ze starego języka, czy też ma prawdziwą zaletę w przeciwieństwie do klas pojedynczego pliku Javy?

Odpowiedz

14

Głównie pliki .h istnieją ze względu na kompatybilność w dół C - cały kod C jest również prawidłowym kodem Objective-C. Kompilator C działa po jednym pliku na raz; każdy plik jest kompilowany i analizowany niezależnie. Kompilator C musiał "zobaczyć" deklarację pewnego symbolu przed pierwszym użyciem. Tak więc, jeśli używasz klasy A w B.m, w pewnym momencie kompilator musiał widzieć deklarację A; Aby uniknąć robienia takich rzeczy jak #include "A.m", konwencja polega na dzieleniu deklaracji w plikach nagłówkowych i implementacji w plikach .c, .m, .cpp ....

Inne języki, takie jak Java, automatycznie skanują pliki w tym samym katalogu B.java podczas kompilowania, aby znaleźć deklarację innych klas; Kompilatory C są nieco "starsze" i muszą # zawierać wszystkie niezbędne nagłówki.

Krótko mówiąc: głównie przyczyny historyczne.

5

Nie musisz mieć plików nagłówkowych. Możesz mieć swój interfejs i implementację w tym samym pliku, ale łatwiej je rozdzielić, a także sprawia, że ​​importowanie klas jest lepsze, a to oznacza, że ​​inne klasy nie dziedziczą obciążenia rzeczy, których nie potrzebują od .m (jak stałe).

7

The Wikipedia entry on header files używa tego samego porównania z Java, które robisz, co jest bonusem:

Niektóre języki programowania (przede wszystkim C, C++ i Objective-C) używają plików nagłówkowych. Pliki te umożliwiają programistom oddzielenie pewnych elementów kodu źródłowego programu w pliki wielokrotnego użytku. Pliki nagłówkowe zawierają często deklaracje forward klas, podprogramów, zmiennych i innych identyfikatorów. Programiści, którzy chcą zadeklarować standardowe identyfikatory w więcej niż jednym pliku źródłowym, mogą umieścić takie identyfikatory w pojedynczym pliku nagłówkowym, który to kod może następnie zawierać , gdy wymagana jest zawartość nagłówka. Ma to na celu utrzymanie interfejsu w nagłówku oddzielnie od implementacji. Standardowa biblioteka C i standardowa biblioteka C++ tradycyjnie deklarują swoje standardowe funkcje w plikach nagłówkowych.

Nowsze, skompilowane języki (takie jak Java, C#) nie używają deklaracji forward; ; identyfikatory są automatycznie rozpoznawane z plików źródłowych i odczytywane bezpośrednio z dynamicznych symboli bibliotecznych. Oznacza to, że pliki nagłówkowe nie są potrzebne.

+1

FWIW, niektóre * dużo * starsze skompilowane języki, takie jak Pascal i Delphi, również nie potrzebują nagłówków. Używają jednostek, w których interfejs i część implementacyjna są w jednym pliku, a deklaracje itp. Są dostępne w przyjaznym dla kompilatora formacie binarnym. –

Powiązane problemy