Qu'est-ce qu'une «unité de traduction» en C ++

236

Je lis à l'époque le "Effective C ++" écrit par Meyers et suis tombé sur le terme "unité de traduction".

Quelqu'un pourrait-il me donner des explications sur:

1) Qu'est-ce que c'est exactement

2) Quand devrais-je envisager de l'utiliser lors de la programmation avec C ++

3) S'il n'est lié qu'à C ++, ou s'il peut être utilisé avec d'autres langages de programmation

Je pourrais déjà l'utiliser sans connaître le terme ....

Harry
la source
1
2. Vous utilisez déjà l'unité de traduction si vous avez inclus des fichiers d'en-tête. C'est un terme utilisé pour référence et non une construction c ++ par exemple
talekeDskobeDa

Réponses:

268

À partir d' ici : ( lien vers la machine de retour )

Selon le standard C ++ ( lien machine de retour ): Une unité de traduction est l'unité de base de compilation en C ++. Il se compose du contenu d'un fichier source unique, plus le contenu de tout fichier d'en-tête directement ou indirectement inclus par celui-ci, moins les lignes qui ont été ignorées à l'aide des instructions de prétraitement conditionnel.

Une seule unité de traduction peut être compilée dans un fichier objet, une bibliothèque ou un programme exécutable.

La notion d'unité de traduction est le plus souvent mentionnée dans les contextes de la règle de définition unique et des modèles.

JeffH
la source
9
Le terme est-il utilisé uniquement en C / C ++?
dekuShrub
2
@dekuShrub en fait, non. Par exemple, dans Rust, une unité de traduction est une caisse, en C ++, la même chose serait appelée bibliothèque entière. Le terme lui-même est universel, mais il a définitivement commencé par C.
Sahsahae
Nouvelle référence qui indique à peu près ce que dit cette réponse: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples
67

Une unité de traduction est à toutes fins utiles un fichier (.c / .cpp), une fois terminé, y compris tous les fichiers d'en-tête.

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

Ana Betts
la source
3
Y compris les fichiers d'en-tête. Les fichiers d'en-tête sont traités par le compilateur, même si aucun code n'est généré. Voir aussi le commentaire du préprocesseur de JeffH, la définition "tout ce que le compilateur voit" est bonne.
Marco van de Voort
10
Vous pouvez très bien compiler des fichiers se terminant par ".h". Le nom de fichier n'est pas important du tout. Le contenu est. Si le contenu de "foo.h" est "int main () {}" vous pouvez le compiler.
Johannes Schaub - litb
@LightnessRacesinOrbit: Oui, ce que j'essayais de dire, c'est qu'il n'est pas orthodoxe de compiler directement un en-tête en tant que TU, plutôt que de le compiler indirectement en TU via l'inclusion. Supprimé le premier commentaire pour être tout à fait faux, gardant le second pour donner à nos nouveaux un contexte.
GManNickG
1
@GManNickG: Que diriez-vous "des fichiers .h ne sont pas conventionnellement alimentés directement au compilateur."
Courses de légèreté en orbite le
@ JohannesSchaub-litb Je pense que vous voulez dire lien, pas compiler. Vous pouvez compiler n'importe quel fichier tant qu'il est correct en C / C ++ avec tous les noms définis. Il serait inutile de compiler un fichier d'en-tête car l'intégralité du point d'un fichier d'en-tête doit être inclus (lu copié) dans les fichiers source, donc ils sont déjà en cours de compilation lorsque vous compilez un fichier source qui l'inclut. Je suppose que vous vouliez dire que vous ne pouvez pas créer d'exécutable à partir d'un fichier qui n'a pas de fonction principale.
pooya13
30

Une question difficile à répondre définitivement. La norme C ++ stipule:

Le texte du programme est conservé dans des unités appelées fichiers sources dans la présente Norme internationale. Un fichier source avec tous les en-têtes (17.4.1.2) et les fichiers source inclus (16.2) via la directive de prétraitement #include, moins toutes les lignes source ignorées par l'une des directives de prétraitement d'inclusion conditionnelle (16.1), est appelé une unité de traduction. [Remarque: il n'est pas nécessaire que tous les programmes C ++ soient traduits en même temps. ]

Donc, pour la plupart des intentions et des fins, une unité de traduction est un seul fichier source C ++ et l'en-tête ou d'autres fichiers qu'elle inclut via le mécanisme de pré-processeur #include.

Concernant vos autres questions:

2) Quand devrais-je envisager de l'utiliser lors de la programmation avec C ++

Vous ne pouvez pas ne pas le considérer - les unités de traduction sont la base d'un programme C ++.

3) S'il n'est lié qu'à C ++, ou s'il peut être utilisé avec d'autres langages de programmation

D'autres langues ont des concepts similaires, mais leur sémantique sera subtilement différente. La plupart des autres langues n'utilisent pas de préprocesseur, par exemple.

Ondrej Slinták
la source
1
Je ne sais pas si cela clarifie ou non. Cela peut être une zone quelque peu trouble - il n'est pas clair d'après le paragraphe standard que j'ai cité que les en-têtes précompilés sont autorisés, par exemple.
1
@GMan, et c'est là que vous devez faire très attention à la règle de définition unique. Si vous incluez une classe dans différentes unités de traduction avec des définitions légèrement différentes avant que cette classe ne soit incluse, ce qui entraîne un code différent pour la classe, cela entraînera des problèmes non définis.
Matt Price
6
@GMan note les deux termes utilisés par la norme: "en-tête" et "fichier source". "header" n'est utilisé que pour la bibliothèque Standard. Un fichier utilisateur qui est inclus par un certain code n'est pas appelé "en-tête" par la norme, mais "fichier source". Le Standard ne connaît pas la différence entre ".h" et ".cpp" que nous, pauvres programmeurs c ++
, composions
8

Le livre le montre assez clairement. Lorsque Meyers fait référence à une «unité de traduction», il désigne un fichier de code source.

Ed S.
la source
1
Non. S'il parlait du code source, il dirait des fichiers source. L'unité de traduction est réalisée en compilant le code source. Notez la nette différence. Il s'agit du code source "Traduit".
Dan
3
@Dan: Non, ce n'est pas le cas. Une unité de traduction est un fichier source après les inclusions qui peut être compilé, c'est-à-dire la sortie du préprocesseur avant la compilation.
Ed S.
1
En fait, malgré ce que la norme C ++ appelle, «unité de traduction» est couramment utilisée pour communiquer l'idée d'une seule «unité» de code compilé. En fait, selon les gars du compilateur Microsoft, vous liez directement "Unités de traduction". msdn.microsoft.com/en-us/library/vstudio/…
Dan
1
Alors essayons-nous d'être des nazis «standard C ++» ou essayons-nous d'aider les gens à communiquer avec le reste de l'industrie? Je sais que c'est un thread C ++, donc je n'entrerai pas dans ce que xcode appelle un tu. Ou toutes les autres définitions du terme.
Dan
1
@Dan: Une unité de traduction est ce que la norme appelle. Im pas vraiment préoccupé par l'opinion des développeurs de compilateurs aléatoires. Il est intéressant de noter que le gars qui déterre un poste de près de cinq ans pour me taquiner et me dire que ma définition est fausse se retourne et m'appelle une "langue nazie" pour corriger la sienne. Yeesh, continuez, vous êtes fatigué de faire face.
Ed S.
4

En plus de l'ODR, l'unité de traduction est importante dans la définition des espaces de noms sans nom, qui remplace l'une des anciennes utilisations de "statique".

Je suppose que je n'ai toujours pas assez de points pour ajouter un commentaire sous la réponse du haut.

Allan Stokes
la source
3

Une unité de traduction est un code qui est transmis au compilateur proprement dit. Cela signifie généralement la sortie de l'exécution du préprocesseur sur le fichier .c.

sigjuice
la source
2

Les programmes C et C ++ sont constitués d'un ou plusieurs fichiers source, chacun contenant une partie du texte du programme. Un fichier source, ainsi que ses fichiers d'inclusion (fichiers qui sont inclus à l'aide de la directive de préprocesseur #include) mais n'incluant pas les sections de code supprimées par les directives de compilation conditionnelle telles que #if, est appelé une "unité de traduction".

ganesh marmat
la source
1

Selon MSDN : les programmes C et C ++ se composent d'un ou de plusieurs fichiers source, chacun contenant une partie du texte du programme. Un fichier source, ainsi que ses fichiers d'inclusion (fichiers qui sont inclus à l'aide de la directive de préprocesseur #include) mais n'incluant pas les sections de code supprimées par les directives de compilation conditionnelle telles que #if, est appelé une "unité de traduction".

rahul
la source
0

Chaque fichier cpp / c (implémentation) sera converti en unité de traduction (c.-à-d., Fichier objet (.obj)) Les en-têtes du fichier cpp seront remplacés par le texte réel des fichiers d'en-tête.

yesraaj
la source
0

Comme d'autres l'ont dit, une unité de traduction est essentiellement le contenu d'un fichier source après prétraitement. C'est la production la plus élevée de la grammaire linguistique; vous n'auriez à vous en préoccuper que si vous écriviez un compilateur C ou C ++.

John Bode
la source
1
"vous n'auriez à vous en préoccuper que si vous écriviez un compilateur C ou C ++." Je ne suis pas d'accord: les programmeurs doivent souvent comprendre ce que fait le compilateur. Ainsi, par exemple, vous devez savoir ce qu'est une unité de traduction afin de comprendre un point important de l'item # 5 dans Effective C ++: "l'ordre relatif d'initialisation des objets statiques non locaux définis dans différentes unités de traduction n'est pas défini".
Channing Moore