2009-07-09 7 views
178

Sto leggendo al momento "l'efficace C++" scritto da Meyers e ho trovato il termine "unità di traduzione".Che cos'è una "unità di traduzione" in C++

Qualcuno potrebbe per favore mi dia una spiegazione:

1) Che cosa è

2) Quando devo considerare l'utilizzo di esso quando la programmazione con C++

3) se si riferisce solo a C++, oppure può essere utilizzato con altri linguaggi di programmazione

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

risposta

206

Da here: (wayback machine link)

Secondo standard C++ (wayback machine link): un'unità di traduzione è l'unità di base di compilazione in C++. Si compone di il contenuto di un singolo file sorgente, più i contenuti di qualsiasi file di intestazione direttamente o indirettamente da esso inclusi, meno quelle linee che sono state ignorate utilizzando pre-elaborazione condizionale dichiarazioni.

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

La nozione di un'unità di traduzione è più spesso menzionata nei contesti della Regola una definizione, e modelli.

52

a tr L'unità di ansazione è a tutti gli effetti un file (.c/.cpp), dopo ha finito di includere 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. Vedere anche il commento del preprocessore di JeffH, la definizione "tutto quello che il compilatore vede" è buona. –

+9

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

+0

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

7

Il libro rende abbastanza chiaro. Quando Meyers fa riferimento a una "unità di traduzione", indica un file di codice sorgente.

+1

No. Se stava parlando del codice sorgente, avrebbe detto file sorgente.L'unità di traduzione viene creata compilando il codice sorgente. Nota la netta differenza. È il codice sorgente "tradotto". – Dan

+1

@Dan: No, non lo è. Un'unità di traduzione è un file sorgente dopo che include * può * essere compilato, cioè l'output del preprocessore prima della compilazione. –

+0

il preprocessore che capita di essere parte del processo di compilazione. Non volevo modificare il becco, ma quando parli di una "unità di traduzione" c'è una netta differenza tra ciò che è stato preelaborato e ciò che non lo ha fatto. Non sono nomi intercambiabili. E questo è il mio punto. – Dan

3

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

0

Ogni file cpp/c (implementazione) verrà convertito in una unità di traduzione (ie. Intestazioni di file oggetto (.obj)) nel file cpp verrà sostituito con il testo effettivo dai file di intestazione.

23

Una domanda difficile a cui rispondere in modo definitivo. Lo standard C++ dichiara:

Il testo del programma viene mantenuto in unità denominate file di origine in questo standard internazionale. Un file sorgente insieme a tutte le intestazioni (17.4.1.2) e file sorgente incluso (16.2) attraverso la pre-elaborazione direttiva #include, al netto di eventuali righe di origine saltati da una delle inclusione condizionale (16.1) pre-elaborazione direzioni tivi , è chiamato un'unità di traduzione.[Nota: un programma C++ non deve essere necessariamente tradotto allo allo stesso tempo. ]

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

quanto riguarda le vostre altre domande:

2) Quando devo considerare l'utilizzo di essa durante la programmazione con C++

Non si può non considerarla - unità di traduzione sono alla base di un C++ programma.

3) Se è collegato solo per C++, o può essere utilizzato con altri programmi lingue

altre lingue hanno concetti simili, ma la loro semantica sarà leggermente diverso. La maggior parte delle altre lingue non usa un preprocessore, per esempio.

+0

Non so se questo chiarisca o no. Questa può essere un'area un po 'torbida - ad esempio, non è chiaro dal para standard citato da quelle intestazioni pre-compilate. –

+0

@GMan, ed è qui che devi fare molta attenzione all'unica regola di definizione. Se includi una classe in diverse unità di traduzione con definizioni leggermente differenti prima che la classe sia inclusa, perché la classe abbia un codice diverso causerà problemi non definiti. –

+5

@GMan annota i due termini usati dallo Standard: "header" e "source file". "header" è usato solo per la libreria Standard. Un file utente incluso da qualche codice non è chiamato "header" dallo Standard, ma "file sorgente". Lo Standard non conosce la differenza tra ".h" e ".cpp" che noi poveri programmatori C++ abbiamo inventato :) –

0

Come altri hanno già detto, un'unità di traduzione è fondamentalmente il contenuto di un file sorgente dopo la pre-elaborazione. È la produzione più alta nella grammatica della lingua; dovresti preoccuparti solo se stai scrivendo un compilatore C o C++.

+0

"dovresti preoccuparti solo se stai scrivendo un compilatore C o C++." Non sono d'accordo: i programmatori spesso hanno bisogno di capire cosa sta facendo il compilatore. Quindi, per esempio, è necessario sapere cos'è un'unità di traduzione per capire un punto importante dall'articolo 5 in Effective C++: "l'ordine relativo di inizializzazione di oggetti statici non locali definiti in unità di traduzione diverse non è definito". –

1

Secondo MSDN: i programmi C e C++ sono costituiti da uno o più file di origine, ognuno dei quali contiene parte del testo del programma. Un file sorgente, insieme ai file di inclusione (file inclusi usando la direttiva #include preprocessore) ma senza includere le sezioni di codice rimosse dalle direttive di compilazione condizionale come #if, viene chiamato "unità di traduzione".

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

2

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

Problemi correlati