Dlaczego musimy napisać plik nagłówka?

12

Zanim wyciągniesz swoje wredne komentarze, wiem - to pytanie nooby. Po raz pierwszy używam języka opartego na C.

Jestem studentem licencjackim uczącym się Celu C na kursie informatyki na temat programowania urządzeń mobilnych. Wiem, że w środowisku akademickim wiele faktów nie jest koniecznych, ponieważ budujesz mniejsze projekty, pracujesz w mniejszych zespołach itp.

Ale nasz profesor wymaga - a XCode obsługuje - plików nagłówkowych .h dla każdego pliku implementacyjnego .m. Wydaje mi się, że to trochę zajęta praca. Muszę się upewnić, że skopiuję każdą sygnaturę metody i zmienną instancji do drugiego pliku. Jeśli zmienię jeden plik, muszę się upewnić, że jest on zgodny z drugim plikiem. Wydaje się, że to tylko garść małych irytacji.

Ale wiem, że musi być jakiś zastosowanie w świecie rzeczywistym dla nagłówka plików. Świetna odpowiedź dotyczyłaby zarówno:

  1. Jaki plik nagłówkowy jest przydatny do tego, że plik implementacji nie jest odpowiedni? Jaki jest jego cel?
  2. Dlaczego jako programiści musimy ręcznie pisać nasze pliki nagłówkowe? Wygląda na to, że można je łatwo wygenerować automatycznie.

Z góry dziękuję!

Hartley Brody
źródło
Czy XCode obsługuje automatyczne refaktoryzowanie, więc jeśli zmienisz podpis w nagłówku, zostanie on automatycznie propagowany do implementacji (i odwrotnie)? A może istnieje wtyczka, która to obsługuje? Wiem, że to jest robić ból ręcznie.
FrustratedWithFormsDesigner
Pierwszą reakcją, kiedy dowiedziałem się o plikach nagłówkowych, było „musi istnieć sposób, aby to zrobić automatycznie”. Byłem dość zdziwiony, kiedy szukałem narzędzia, które by w tym pomogło i nie znalazłem żadnych świetnych, oczywistych wyborów.
Hartley Brody,
Dziwi mnie, że taka funkcjonalność nie istnieje. Wiem, że Eclipse może dokonać takiego refaktoryzacji dla Java, nie wiem czy wtyczki C / C ++ mogą refaktoryzować nagłówek / impl. Myślę, że jeśli takie narzędzie nie istnieje dla XCode, może być coś wartego opracowania. ;)
FrustratedWithFormsDesigner

Odpowiedzi:

9
  1. W skrócie;

    • Plik nagłówkowy definiuje API dla modułu. Jest to wykaz umów, które mogą wywoływać osoby trzecie. Moduł można uznać za czarną skrzynkę dla stron trzecich.

    • Implementacja implementuje moduł. To jest wnętrze czarnej skrzynki. Jako programista modułu musisz to napisać, ale jako użytkownik modułu strony trzeciej nie powinieneś wiedzieć nic o implementacji. Nagłówek powinien zawierać wszystkie potrzebne informacje.

  2. Niektóre części pliku nagłówkowego mogą być generowane automatycznie - deklaracje metod. Wymagałoby to dodania adnotacji do implementacji, ponieważ prawdopodobnie istnieją prywatne metody implementacji, które nie stanowią części interfejsu API i nie należą do nagłówka.

Pliki nagłówkowe zawierają czasem inne informacje; definicje typów, stałe definicje itp. Należą one do pliku nagłówkowego, a nie do implementacji.

Luke Graham
źródło
Ale kiedy ktoś znalazłby się w sytuacji, w której musiałby użyć mojego kodu, ale miałby dostęp tylko do pliku .h? Czy nadal nie potrzebują .m, aby go uruchomić?
Hartley Brody,
1
Rozumiem potrzebę abstrakcji na poziomie teoretycznym na wypadek zmiany szczegółów implementacji, ale nie jestem pewien, kiedy taka sytuacja się pojawi.
Hartley Brody,
10
Czasami, zwykle z przyczyn komercyjnych, możesz chcieć zezwolić komuś na użycie twojego kodu, ale nie mieć dostępu do twojej implementacji. W takim przypadku należy podać plik nagłówka i kod biblioteki lub obiektu, który został już skompilowany.
Luke Graham
Ahh rozumiem. Nie sądziłem, że kod będzie już skompilowany, a więc użyteczny, ale nieczytelny. Dzięki!
Hartley Brody,
3
Ponadto, dlaczego chciałbym przeczytać implementację, aby wiedzieć, jak korzystać z kodu? Wystarczy odczytać plik nagłówkowy.
Per Johansson
5

Głównym powodem nagłówka jest możliwość umieszczenia #includego w innym pliku, dzięki czemu można korzystać z funkcji w jednym pliku z innego pliku. Nagłówek zawiera (tylko) wystarczająco, aby móc korzystać z funkcji, a nie z samych funkcji, więc (mamy nadzieję) kompilacja jest znacznie szybsza.

Utrzymanie dwóch osobno większości wyników, ponieważ nikt nie napisał edytora, który bardzo dobrze automatyzuje proces. Nie ma zbyt wielu powodów, dla których nie mogli tego zrobić, a niektórzy nawet próbowali - ale edytorzy, którzy to zrobili, nigdy nie radzili sobie dobrze na rynku, a bardziej popularni redaktorzy tego nie przyjęli.

Jerry Coffin
źródło
2

Dołączenie nagłówka pozwala Twojemu kodowi wywoływać funkcje lub metody, które zostały napisane gdzie indziej i które mogą, ale nie muszą być częścią twojego projektu / kompilacji oprogramowania, ale które mogą być znalezione przez „linkera” podczas tworzenia oprogramowania.

Na przykład, kiedy wywołujesz funkcję w standardowej bibliotece C, nie chcesz umieszczać wszystkich wewnętrznych funkcji tej funkcji w swoim projekcie - po prostu oczekujesz, że twój program będzie mógł ją wywołać.

Ale twój kompilator musi zostać poinformowany, że funkcja istnieje gdzieś, nawet jeśli nie widzi kodu, a nagłówek to robi. Po zakończeniu kompilatora wywoływany jest linker, który próbuje „połączyć” te fragmenty kodu, które pozostały wiszące, takie jak wywołania biblioteki.

adrianmcmenamin
źródło
1

Pliki nagłówkowe służą głównie do deklarowania i dołączania podpisów (tj. Nazwy funkcji, wartości zwracanej i argumentów) funkcji w innych plikach. Kompilator musi znać te podpisy podczas kompilowania i łączenia plików.

Przeczytaj ten artykuł, aby uzyskać więcej informacji.

Bernard
źródło