Jednostka tłumacząca (programowanie)
W terminologii języków programowania C i C++ jednostka translacji (lub, mówiąc prościej, jednostka kompilacji) jest ostatecznym wejściem do kompilatora C lub C++ , z którego generowany jest plik obiektowy . Jednostka tłumacząca składa się z grubsza z pliku źródłowego po przetworzeniu go przez preprocesor C , co oznacza, że pliki nagłówkowe wymienione w dyrektywach #include
są dosłownie uwzględnione , sekcje kodu wewnątrz #ifndef
mogą być uwzględnione, a makra zostały rozszerzone.
Kontekst
Program AC składa się z jednostek zwanych plikami źródłowymi (lub plikami preprocessingu ), które oprócz kodu źródłowego zawierają dyrektywy dla preprocesora C. Jednostka translacji to wyjście preprocesora C – plik źródłowy po jego wstępnym przetworzeniu .
Przetwarzanie wstępne polega w szczególności na rozszerzeniu pliku źródłowego w celu rekurencyjnego zastąpienia wszystkich dyrektyw #include
plikiem dosłownym zadeklarowanym w dyrektywie (zwykle są to pliki nagłówkowe , ale prawdopodobnie inne pliki źródłowe); wynikiem tego kroku jest jednostka translacji wstępnego przetwarzania . Dalsze kroki obejmują między innymi rozszerzenie makro dyrektyw #define
i warunkową kompilację dyrektyw #ifdef ;
to tłumaczy jednostkę translacji przetwarzania wstępnego na jednostkę translacji . Z jednostki tłumaczącej kompilator generuje plik obiektowy , który może być dalej przetwarzany i łączony (ewentualnie z innymi plikami obiektowymi) w celu utworzenia programu wykonywalnego .
Należy zauważyć, że preprocesor jest w zasadzie niezależny od języka i jest preprocesorem leksykalnym , działającym na poziomie analizy leksykalnej – nie wykonuje analizy składniowej, a zatem nie jest w stanie wykonać żadnego przetwarzania specyficznego dla składni C. Dane wejściowe kompilatora to jednostka translacji, dlatego nie widzi on żadnych dyrektyw preprocesora, które zostały przetworzone przed rozpoczęciem kompilacji. Podczas gdy dana jednostka tłumaczeniowa jest zasadniczo oparta na pliku, rzeczywisty kod źródłowy wprowadzony do kompilatora może znacznie różnić się od pliku źródłowego, który widzi programista, szczególnie ze względu na rekurencyjne włączanie nagłówków.
Zakres
Jednostki translacyjne definiują zakres , w przybliżeniu zakres plików i działają podobnie do zakresu modułów ; w terminologii C określa się to mianem powiązania wewnętrznego , które jest jedną z dwóch form powiązania w C. Nazwy (funkcje i zmienne) zadeklarowane poza blokiem funkcyjnym mogą być widoczne albo tylko w obrębie danej jednostki translacji, w takim przypadku mówi się, że mają powiązania wewnętrzne - nie są widoczne dla konsolidatora - lub mogą być widoczne dla innych plików obiektowych, w którym to przypadku mówi się, że mają powiązania zewnętrzne i są widoczne dla konsolidatora.
C nie ma pojęcia o modułach. Jednak oddzielne pliki obiektowe (a więc także jednostki translacji używane do tworzenia plików obiektowych) działają podobnie do oddzielnych modułów, a jeśli plik źródłowy nie zawiera innych plików źródłowych, wewnętrzne powiązanie (zakres jednostki translacji) może być traktowane jako „plik zakres, w tym wszystkie pliki nagłówkowe”.
Organizacja kodu
Większość kodu projektu jest zwykle przechowywana w plikach z sufiksem .c
(lub .cpp
, .cxx
lub .cc
dla C++ , z których .cpp
jest używany najbardziej konwencjonalnie). Pliki, które mają być dołączone, zwykle mają .h
( .hpp
lub .hh
są również używane w C++, ale .h
jest najbardziej powszechne nawet w C++) i generalnie nie zawierają definicji funkcji ani zmiennych, aby uniknąć konfliktów nazw, gdy nagłówki są zawarte w wielu plikach źródłowych, jak to często bywa. Pliki nagłówkowe mogą być i często są zawarte w innych plikach nagłówkowych. To standardowa praktyka dla wszystkich .c
w projekcie, aby zawierały co najmniej jeden plik .h
.