Che cos'è una "unità di traduzione" in C ++


236

Al momento sto leggendo il "C ++ efficace" scritto da Meyers e ho trovato il termine "unità di traduzione".

Qualcuno potrebbe darmi una spiegazione di:

1) Che cos'è esattamente

2) Quando dovrei considerare di usarlo durante la programmazione con C ++

3) Se è correlato solo al C ++ o può essere utilizzato con altri linguaggi di programmazione

Potrei già usarlo senza conoscere il termine ....


1
2. Si sta già utilizzando l'unità di traduzione se sono stati inclusi file di intestazione. È un termine usato come riferimento e non un costrutto c ++ per dire
talekeDskobeDa

Risposte:


268

Da qui : ( collegamento macchina di ritorno )

Secondo lo standard C ++ ( wayback machine link ): un'unità di traduzione è l'unità base della compilazione in C ++. Consiste nel contenuto di un singolo file sorgente, più il contenuto di tutti i file di intestazione direttamente o indirettamente inclusi da esso, meno quelle righe che sono state ignorate usando istruzioni di preelaborazione condizionali.

Una singola unità di traduzione può essere compilata in un file oggetto, libreria o programma eseguibile.

La nozione di unità di traduzione è spesso citata nei contesti della One Definition Rule e nei template.


9
Il termine è usato solo in C / C ++?
dekuShrub,

2
@dekuShrub è un dato di fatto, no. Ad esempio, in Rust, un'unità di traduzione è una cassa, in C ++ la stessa cosa sarebbe indicata come un'intera libreria. Il termine in sé è universale, ma sicuramente è iniziato con C.
Sahsahae, il

Nuovo riferimento che afferma approssimativamente ciò che afferma questa risposta: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples

67

Un'unità di traduzione è a tutti gli effetti un file (.c / .cpp), dopo che è stata completata includendo tutti i file di intestazione.

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


3
Compresi i file di intestazione. I file di intestazione vengono elaborati dal compilatore, anche se non viene generato alcun codice. Vedi anche il commento sul preprocessore di JeffH, la definizione "tutto ciò che il compilatore vede" è buona.
Marco van de Voort,

10
È possibile compilare file che terminano con ".h" bene. Il nome del file non è affatto importante. Il contenuto è. Se il contenuto di "foo.h" è "int main () {}" puoi compilarlo.
Johannes Schaub - litb

@LightnessRacesinOrbit: Sì, quello che stavo cercando di dire è che non è ortodosso compilare direttamente un'intestazione come TU, piuttosto che indirettamente compilarla in una TU tramite inclusione. Eliminato il primo commento per essere semplicemente sbagliato, mantenendo il secondo per dare un contesto ai nostri nuovi.
GManNickG

1
@GManNickG: Che ne dici di "I file .h non vengono tradizionalmente inviati direttamente al compilatore."
Corse della leggerezza in orbita,

@ JohannesSchaub-litb Penso che intendi link, non compilare. È possibile compilare qualsiasi file purché sia ​​C / C ++ corretto con tutti i nomi definiti. Sarebbe inutile compilare un file di intestazione poiché l'intero punto di un file di intestazione deve essere incluso (letto copiato) nei file di origine, quindi vengono già compilati quando si compila un file di origine che lo include. Immagino che cosa intendevi dire è che non puoi creare un eseguibile da un file che non ha una funzione principale.
pooya13,

30

Una domanda difficile a cui rispondere definitivamente. Lo standard C ++ afferma:

Il testo del programma è conservato in unità chiamate file sorgente in questo standard internazionale. Un file di origine insieme a tutte le intestazioni (17.4.1.2) e file di origine inclusi (16.2) tramite la direttiva di preelaborazione #include, al netto di qualsiasi riga di origine ignorata da una qualsiasi delle direttive di preelaborazione di inclusione condizionale (16.1), è chiamato unità di traduzione. [Nota: non è necessario che tutti i programmi C ++ vengano tradotti contemporaneamente. ]

Quindi, per la maggior parte degli scopi, un'unità di traduzione è un singolo file sorgente C ++ e l'intestazione o altri file che include tramite il meccanismo preprocessore #include.

Per quanto riguarda le altre tue domande:

2) Quando dovrei considerare di usarlo durante la programmazione con C ++

Non puoi non considerarlo: le unità di traduzione sono la base di un programma C ++.

3) Se è correlato solo al C ++ o può essere utilizzato con altri linguaggi di programmazione

Altre lingue hanno concetti simili, ma la loro semantica sarà leggermente diversa. La maggior parte delle altre lingue non utilizza un preprocessore, ad esempio.


1
Non so se questo chiarisca o no. Questa può essere un'area alquanto oscura - non è chiaro dallo standard para I citato dalle intestazioni precompilate, ad esempio.

1
@GMan, ed è qui che devi stare molto attento alla regola di una definizione. Se includi una classe in diverse unità di traduzione con definizioni leggermente diverse prima che venga inclusa quella classe che causa un codice diverso, la classe causerà problemi indefiniti.
Matt Price,

6
@GMan nota i due termini usati dallo Standard: "header" e "file sorgente". "header" viene utilizzato solo per la libreria standard. Un file utente incluso in alcuni codici non è chiamato "header" dallo Standard, ma "file sorgente". Lo standard non è a conoscenza della differenza tra ".h" e ".cpp" inventati da noi poveri programmatori c ++ :)
Johannes Schaub - litb

8

Il libro lo chiarisce abbastanza. Quando Meyers fa riferimento a una "unità di traduzione", intende un file di codice sorgente.


1
No. Se stesse parlando del codice sorgente, direbbe i file sorgente. L'unità di traduzione viene creata compilando il codice sorgente. Nota la differenza netta. È il codice sorgente "tradotto".
Dan,

3
@Dan: No, non lo è. Un'unità di traduzione è un file sorgente dopo le inclusioni che può essere compilato, ovvero l'output del preprocessore prima della compilazione.
Ed S.

1
In effetti, nonostante ciò che lo standard C ++ lo chiama, "unità di traduzione" è comunemente usata per comunicare l'idea di una singola "Unità" di codice compilato. In effetti, secondo i compilatori Microsoft, si collega direttamente "Unità di traduzione". msdn.microsoft.com/en-us/library/vstudio/…
Dan

1
Quindi stiamo cercando di essere nazisti "standard C ++" o stiamo cercando di aiutare le persone a comunicare con il resto del settore? So che questo è un thread C ++, quindi non entrerò in quello che xcode chiama tu. O tutte le altre definizioni del termine.
Dan,

1
@Dan: un'unità di traduzione è ciò che lo standard chiama. Non mi interessa davvero l'opinione degli sviluppatori di compilatori casuali. Interessante il fatto che il ragazzo che scava un post di quasi cinque anni su nitpick e mi ha detto che la mia definizione è sbagliata si gira e mi chiama un "linguaggio nazista" per aver corretto il suo. Sì, vai avanti, ti stai stancando di affrontare.
Ed S.

4

Oltre all'ODR, l'unità di traduzione è importante nella definizione di spazi dei nomi senza nome, che sostituisce uno dei vecchi usi di "statico".

Immagino di non avere ancora abbastanza punti per aggiungere un commento sotto la risposta in alto.


3

Un'unità di traduzione è un codice che viene passato al compilatore corretto. Questo significa in genere l'output dell'esecuzione del preprocessore sul file .c.


2

I programmi C e C ++ sono costituiti da uno o più file sorgente, ognuno dei quali contiene parte del testo del programma. Un file sorgente, insieme ai suoi file include (file inclusi usando la direttiva preprocessore #include) ma non include sezioni di codice rimosse da direttive di compilazione condizionale come #if, è chiamato "unità di traduzione".


1

Secondo MSDN : i programmi C e C ++ consistono in uno o più file sorgente, ognuno dei quali contiene parte del testo del programma. Un file sorgente, insieme ai suoi file include (file inclusi utilizzando la direttiva preprocessore #include) ma non include sezioni di codice rimosse da direttive di compilazione condizionale come #if, è chiamato "unità di traduzione".


0

Ogni file cpp / c (implementazione) verrà convertito in un'unità di traduzione (ad es., File oggetto (.obj)) le intestazioni nel file cpp verranno sostituite con il testo effettivo dai file di intestazione.


0

Come altri hanno già detto, un'unità di traduzione è sostanzialmente il contenuto di un file sorgente dopo la preelaborazione. È la massima produzione nella grammatica della lingua; dovresti preoccuparti solo se stavi scrivendo un compilatore C o C ++.


1
"dovresti preoccuparti solo se stavi scrivendo un compilatore C o C ++." Non sono d'accordo: i programmatori spesso devono capire cosa sta facendo il compilatore. Pertanto, ad esempio, è necessario sapere cos'è un'unità di traduzione per comprendere un punto importante dall'articolo 5 in C ++ effettivo: "l'ordine relativo di inizializzazione di oggetti statici non locali definiti in unità di traduzione diverse non è definito".
Channing Moore,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.