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 ....

Złupić
źródło
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.

JeffH
źródło
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

Ana Betts
źródło
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.

Ondrej Slinták
źródło
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.

Ed S.
źródło
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ą.

Allan Stokes
źródło
3

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

sigjuice
źródło
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ą”.

świstak ganeść
źródło
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ą”.

Rahul
źródło
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.

tak
źródło
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 ++.

John Bode
źródło
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,