czwartek, 26 kwietnia 2018

Język C - Pliki nagłówkowe


C - Pliki nagłówkowe

Plik nagłówkowy to plik z rozszerzeniem .h, który zawiera deklaracje funkcji C i definicje makr do współdzielenia między kilkoma plikami źródłowymi. Istnieją dwa typy plików nagłówkowych: pliki, które programista zapisuje, oraz pliki dołączone do kompilatora.
Żądasz, aby użyć pliku nagłówkowego w swoim programie, włączając go do dyrektywy przetwarzania wstępnego C #include, tak jak widziałeś dołączenie pliku nagłówkowego stdio.h, który jest dołączony wraz z twoim kompilatorem.
Włączenie pliku nagłówkowego jest równoznaczne z kopiowaniem zawartości pliku nagłówkowego, ale nie robimy tego, ponieważ będzie to podatne na błędy i nie jest dobrym pomysłem kopiowanie zawartości pliku nagłówkowego w plikach źródłowych, szczególnie jeśli mamy wiele plików źródłowych w programie.
Prostą praktyką w programach C lub C++ jest to, że zachowujemy wszystkie stałe, makra, globalne zmienne systemowe i prototypy funkcji w plikach nagłówkowych i dołączamy ten plik nagłówkowy wszędzie tam, gdzie jest on wymagany.

Dołącz składnię

Zarówno plik nagłówkowy użytkownika, jak i systemowy są dołączane przy użyciu dyrektywy przetwarzania wstępnego #include. Ma następujące dwie formy:
#include <plik>
To polecenie jest używane dla plików nagłówkowych systemu. Szuka pliku o nazwie "plik" na standardowej liście katalogów systemowych. Możesz dodawać katalogi do tej listy za pomocą opcji -I podczas kompilowania kodu źródłowego.
#include "plik"
To polecenie jest używane dla plików nagłówkowych twojego własnego programu. Szuka pliku o nazwie "plik" w katalogu zawierającym bieżący plik. Możesz dodawać katalogi do tej listy za pomocą opcji -I podczas kompilowania kodu źródłowego.

Uwzględnij operację

Dyrektywa #include  działa poprzez kierowanie preprocesora C do skanowania określonego pliku jako wejścia przed kontynuowaniem z resztą bieżącego pliku źródłowego. Dane wyjściowe z preprocesora zawierają dane wyjściowe już wygenerowane, a następnie dane wyjściowe wynikające z dołączonego pliku, a następnie dane wyjściowe pochodzące z tekstu następującego po dyrektywie #include. Na przykład, jeśli masz plik nagłówkowy header.h w następujący sposób:
char *test (void);
i główny program o nazwie program.c, który używa pliku nagłówkowego, takiego jak ten -
int x;
#include "header.h"

int main (void) {
   puts (test ());
}
kompilator zobaczy ten sam strumień tokenów, tak jak gdyby program.c przeczytał.
int x;
char *test (void);

int main (void) {
   puts (test ());
}

Nagłówki jednorazowe

Jeśli plik nagłówkowy zostanie dwukrotnie uwzględniony, kompilator przetworzy jego zawartość dwukrotnie i spowoduje to błąd. Standardowy sposób, aby temu zapobiec, polega na zamknięciu całej rzeczywistej zawartości pliku w trybie warunkowym, takim jak ten -
#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

Ta konstrukcja jest powszechnie znana jako wrapper #ifndef. Gdy nagłówek zostanie ponownie dołączony, warunek będzie fałszywy, ponieważ zdefiniowano HEADER_FILE. Preprocesor pominie całą zawartość pliku, a kompilator nie zobaczy go dwukrotnie.


Czasami konieczne jest wybranie jednego z kilku różnych plików nagłówkowych, które mają zostać włączone do programu. Na przykład mogą określać parametry konfiguracyjne, które będą używane w różnych systemach operacyjnych. Możesz to zrobić z serią warunków w następujący sposób:
#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif
Jednak wraz z rozwojem staje się on nużący, zamiast tego preprocesor oferuje możliwość użycia makra do nazwy nagłówka. Nazywa się to włączeniem obliczeniowym . Zamiast wpisywania nazwy nagłówka jako bezpośredniego argumentu #include, po prostu wpisujesz tam nazwę makra:
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H
SYSTEM_H zostanie rozwinięty, a preprocesor będzie szukał system_1.h tak, jakby pierwotnie napisano #include. SYSTEM_H może być zdefiniowany przez twój plik Makefile z opcją -D.

Poprzednia strona                                                          Następna strona

Brak komentarzy:

Prześlij komentarz