2011-12-01 9 views
10

C'è una differenza tra ciò che un'unità di traduzione è in C++ e C?Unità di traduzione in C e C++

in altri post, ho letto che un file di intestazione e la fonte fa un'unità di traduzione, ma può un file sorgente da solo essere chiamato un'unità di traduzione in C++ dove contiene tutte le definizioni in un unico file?

+4

I file sorgente preelaborati sono unità di traduzione. –

+1

@KerrekSB Non è una risposta? – daramarak

+0

@KerrekSB, il cap di rep? :) –

risposta

22

Un'unità di traduzione non è "un colpo di testa e un file di origine". Potrebbe includere un migliaio di file di intestazione (e anche migliaia di file di origine).

Un'unità di traduzione è semplicemente ciò che è comunemente noto come "file sorgente" o un "file cpp" dopo essere pre-elaborato. Se il file sorgente #include s altri file il testo di quei file viene incluso nell'unità di traduzione dal preprocessore. Non c'è differenza tra C e C++ su questo argomento.

+0

Se metto la mia definizione di classe in '.cpp' invece di usare un' .h' per mettere la dichiarazione di classe. Posso chiamare ".cpp" un'unità di traduzione? – user103214

+1

Sì, non è necessario disporre di file di intestazione. –

+3

@ user974191: è necessario utilizzare le intestazioni per evitare di copiare il codice più e più volte. Il meccanismo '# include' consente di scrivere una sola volta e il compilatore lo copia per te: è una questione di organizzazione del codice e non ha molto a che fare con il concetto di unità di traduzione. –

1

L'intestazione viene aggiunta al file .cpp durante la pre-elaborazione, quindi il compilatore lavora fondamentalmente su una grande porzione di codice, contenente sia .cpp che tutti i .h aggiunti da "#include".

Questa è l'unità di traduzione.

0

un'unità di traduzione è in realtà quello che si ottiene una volta che i file di origine e di intestazione sono passati attraverso la pre-elaborazione (che si espande la sorgente utilizzando i file di intestazione) e precompilazione. Il compilatore usa l'unità di traduzione per produrre i file .obj che vedi nella directory di output del compilatore.

+0

- precompilazione (non esiste un passaggio che conosca) –

+1

produzione di intestazioni precompilate - abbastanza comune su grandi progetti C++. – ChrisBD

+0

Ah! Non vorrei doppiarlo davvero sulla precompilazione, ma ora capisco. Quanto all'essere comuni ... sì e no. Sto lavorando a progetti che condividono milioni di righe e il miglior risultato non è quello di precompilare le intestazioni, ma piuttosto di condividere gli oggetti prodotti tra gli sviluppatori di uno stesso team (CCache) e distribuire la build. –

1

Dipende da cosa si intende per “ differenza ”. Sia C e C++ definiscono simile: in sostanza, tutto ciò che viene compilato quando si compila un file sorgente (quindi, tutte le intestazioni inclusi, ampliato macro, etc.). Ma non è la stessa cosa nelle due lingue; cose come modelli significa che le unità di traduzione si comportano in modo diverso in C++ che in C. (C++ e la regola della definizione, per esempio.)

+0

È corretto avere due definizioni di classe con lo stesso nome in due file .cpp in base a una regola di definizione? Grazie. – user103214

+0

@ user974191 Solo se consistono esattamente degli stessi token e tutti i simboli si legano esattamente alla stessa cosa. Questo è il motivo per cui sono stati introdotti spazi dei nomi senza nome: inserire le classi locali in uno spazio dei nomi senza nome e il loro nome completo è diverso; non sono più la stessa classe, perché non hanno più lo stesso nome. –

-2

insieme di file sorgenti visto dal compilatore e tradotto come unità

+0

Sarebbe più utile se puoi spiegare la tua risposta in frasi complete. – ilke444

Problemi correlati