Co to jest „jednostka tłumacząca” w C ++


236

Czytam w tym czasie „Effective C ++” napisany przez Meyersa i spotkałem się z terminem „jednostka tłumacząca”.

Czy ktoś mógłby mi wyjaśnić:

1) Co to dokładnie jest

2) Kiedy powinienem rozważyć użycie go podczas programowania w C ++

3) Jeśli jest związany tylko z C ++ lub może być używany z innymi językami programowania

Mogę już z niego korzystać, nie znając terminu ....


1
2. Używasz już jednostki tłumaczeniowej, jeśli dołączyłeś pliki nagłówkowe. Jest to termin używany w celach informacyjnych, a nie konstrukt c ++ na
słowo

Odpowiedzi:


268

Od tutaj : ( Wayback Link maszyna )

Zgodnie ze standardowym C ++ ( łącze maszynowe wayback ): Jednostka tłumacząca jest podstawową jednostką kompilacji w C ++. Składa się z zawartości pojedynczego pliku źródłowego, a także zawartości zawartych w nim plików nagłówkowych, bezpośrednio lub pośrednio, pomniejszonych o wiersze, które zostały zignorowane przy użyciu instrukcji warunkowego przetwarzania wstępnego.

Pojedynczą jednostkę tłumaczeniową można skompilować w plik obiektowy, bibliotekę lub program wykonywalny.

Pojęcie jednostki tłumaczeniowej jest najczęściej wymieniane w kontekście reguły jednej definicji i szablonów.


9
Czy ten termin jest używany tylko w C / C ++?
dekuShrub 18.04.18

2
@dekuShrub w rzeczywistości nie. Na przykład w Rust jednostka tłumacząca jest skrzynią, w C ++ to samo byłoby nazywane całą biblioteką. Sam termin jest uniwersalny, ale na pewno zaczął się od C.
Sahsahae

Nowe odniesienie, które z grubsza określa, co stwierdza ta odpowiedź: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples

67

Jednostką tłumaczeniową jest plik (.c / .cpp), który po zakończeniu pracy zawiera wszystkie pliki nagłówkowe.

http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx


3
W tym pliki nagłówkowe. Pliki nagłówkowe są przetwarzane przez kompilator, nawet jeśli nie jest generowany żaden kod. Zobacz także komentarz preprocesora Jeffa, definicja „wszystko, co widzi kompilator” jest dobra.
Marco van de Voort

10
Możesz skompilować pliki z rozszerzeniem „.h” w porządku. Nazwa pliku wcale nie jest ważna. Treść jest. Jeśli zawartość „foo.h” to „int main () {}”, możesz ją skompilować.
Johannes Schaub - litb

@LightnessRacesinOrbit: Tak, próbowałem powiedzieć, że niekonwencjonalne jest bezpośrednie kompilowanie nagłówka jako JT, a nie pośrednie kompilowanie go w JJ przez włączenie. Usunięto pierwszy komentarz, ponieważ jest całkowicie błędny, pozostawiając drugi, aby dać kontekst nowym.
GManNickG

1
@GManNickG: Co powiesz na „pliki .h zwykle nie są podawane bezpośrednio do kompilatora”.
Wyścigi lekkości na orbicie

@ JohannesSchaub-litb Myślę, że masz na myśli link, a nie kompilację. Możesz skompilować dowolny plik, pod warunkiem, że jest to poprawny C / C ++ ze wszystkimi zdefiniowanymi nazwami. Kompilacja pliku nagłówkowego byłaby bezużyteczna, ponieważ cały punkt pliku nagłówkowego należy włączyć (odczytać skopiowany) do plików źródłowych, więc są one już kompilowane podczas kompilacji pliku źródłowego, który go zawiera. Myślę, że chciałeś powiedzieć, że nie możesz utworzyć pliku wykonywalnego z pliku, który nie ma głównej funkcji.
pooya13

30

Trudne pytanie, na które należy ostatecznie odpowiedzieć. Standard C ++ stanowi:

Tekst programu jest przechowywany w jednostkach zwanych plikami źródłowymi w niniejszym standardzie międzynarodowym. Plik źródłowy wraz ze wszystkimi nagłówkami (17.4.1.2) i dołączonymi plikami źródłowymi (16.2) przez dyrektywę wstępnego przetwarzania #include, pomijając wszelkie wiersze źródłowe pominięte przez którąkolwiek z dyrektyw wstępnego przetwarzania warunkowego włączenia (16.1), nazywa się jednostką tłumaczącą. [Uwaga: nie wszystkie programy w C ++ muszą być tłumaczone jednocześnie. ]

Więc dla większości intencji i celów jednostka tłumacząca jest pojedynczym plikiem źródłowym C ++ i nagłówkiem lub innymi plikami, które zawiera za pośrednictwem mechanizmu #include preprocesora.

Jeśli chodzi o inne pytania:

2) Kiedy powinienem rozważyć użycie go podczas programowania w C ++

Nie można tego nie brać pod uwagę - jednostki tłumaczeniowe są podstawą programu w C ++.

3) Jeśli jest związany tylko z C ++ lub może być używany z innymi językami programowania

Inne języki mają podobne pojęcia, ale ich semantyka będzie nieco inna. Większość innych języków nie używa na przykład preprocesora.


1
Nie wiem czy to wyjaśnia, czy nie. Może to być nieco mętny obszar - na przykład ze standardowego para cytowanego przeze mnie z wcześniej skompilowanych nagłówków nie jest jasne.

1
@GMan, i tutaj musisz bardzo uważać na regułę jednej definicji. Jeśli dodasz klasę do różnych jednostek tłumaczeniowych z nieco innymi definicjami przed włączeniem tej klasy, co spowoduje, że klasa będzie miała inny kod, spowoduje to nieokreślone problemy.
Matt Price

6
@GMan zwraca uwagę na dwa terminy używane przez Standard: „nagłówek” i „plik źródłowy”. „nagłówek” jest używany tylko dla biblioteki standardowej. Plik użytkownika zawarty w jakimś kodzie nie jest nazywany „nagłówkiem” przez Standard, ale „plikiem źródłowym”. Standard nie wie o różnicy między „.h” a „.cpp”, którą stworzyliśmy my biedni programiści c ++ :)
Johannes Schaub - litb

8

Książka wyjaśnia to dość wyraźnie. Kiedy Meyers odnosi się do „jednostki tłumaczącej”, ma na myśli plik kodu źródłowego.


1
Nie. Gdyby mówił o kodzie źródłowym, powiedziałby pliki źródłowe. Jednostka tłumacząca jest tworzona przez kompilację kodu źródłowego. Zwróć uwagę na wyraźną różnicę. Jest to „przetłumaczony” kod źródłowy.
Dan

3
@Dan: Nie, nie jest. Jednostka tłumacząca jest plikiem źródłowym po włączeniu, który może zostać skompilowany, tj. Wyjście preprocesora przed kompilacją.
Ed S.

1
W rzeczywistości, pomimo tego, jak nazywa to standard C ++, „jednostka tłumacząca” jest powszechnie używana do przekazywania idei pojedynczej „jednostki” skompilowanego kodu. W rzeczywistości, według facetów kompilatora Microsoft, łączysz bezpośrednio „Jednostki tłumaczeniowe”. msdn.microsoft.com/en-us/library/vstudio/...
Dan

1
Czy staramy się być nazistami „w standardzie C ++”, czy też staramy się pomagać ludziom komunikować się z resztą branży? Wiem, że to jest wątek C ++, więc nie będę wchodził w to, co xcode nazywa tu. Lub wszystkie inne definicje tego terminu.
Dan

1
@ Dan: Jednostka tłumacząca to, co nazywa ją standard. Naprawdę nie interesuje mnie opinia losowych twórców kompilatorów. Interesujące jest to, że facet, który wykopuje prawie pięcioletni post do nitpicka i mówi mi, że moja definicja jest błędna, odwraca się i nazywa mnie „nazistowskim językiem” za jego poprawienie. Tak, ruszaj, męczycie się z tym.
Ed S.

4

Oprócz ODR, jednostka tłumacząca jest ważna w definicji nienazwanych przestrzeni nazw, która zastępuje jedno ze starych zastosowań słowa „statyczny”.

Chyba nadal nie mam wystarczającej liczby punktów, aby dodać komentarz pod pierwszą odpowiedzią.


3

Jednostką tłumaczeniową jest kod przekazywany do właściwego kompilatora. Zazwyczaj oznacza to wynik działania preprocesora w pliku .c.


2

Programy C i C ++ składają się z jednego lub większej liczby plików źródłowych, z których każdy zawiera część tekstu programu. Plik źródłowy wraz z plikami włączającymi (pliki dołączane przy użyciu dyrektywy preprocesora #include), ale bez uwzględnienia sekcji kodu usuniętych przez dyrektywy kompilacji warunkowej, takiej jak #if, nazywa się „jednostką tłumaczącą”.


1

Według MSDN : C i C ++ programy składają się z jednego lub więcej plików źródłowych, z których każdy zawiera część tekstu programu. Plik źródłowy wraz z plikami włączającymi (pliki dołączane przy użyciu dyrektywy preprocesora #include), ale bez uwzględnienia sekcji kodu usuniętych przez dyrektywy kompilacji warunkowej, takiej jak #if, nazywa się „jednostką tłumaczącą”.


0

Każdy plik cpp / c (implementacja) zostanie przekonwertowany na jednostkę tłumaczeniową (tj. Plik obiektowy (.obj)) nagłówki w pliku cpp zostaną zastąpione rzeczywistym tekstem z plików nagłówkowych.


0

Jak powiedzieli inni, jednostka tłumacząca jest w zasadzie zawartością pliku źródłowego po wstępnym przetwarzaniu. Jest to najwyższa produkcja w gramatyce językowej; trzeba by się o to martwić, gdybyś pisał kompilator C lub C ++.


1
„musiałbyś się tym martwić, gdybyś pisał kompilator C lub C ++.” Nie zgadzam się: programiści często muszą zrozumieć, co robi kompilator. Tak więc, na przykład, musisz wiedzieć, czym jest jednostka tłumacząca, aby zrozumieć ważny punkt z punktu 5 w Efektywnym C ++: „względna kolejność inicjalizacji nielokalnych obiektów statycznych zdefiniowanych w różnych jednostkach tłumaczeniowych jest nieokreślona”.
Channing Moore,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.