En la terminología del lenguaje de programación C y C ++ , una unidad de traducción (o más casualmente una unidad de compilación) es la entrada final a un compilador C o C ++ a partir del cual se genera un archivo objeto . [1] Una unidad de traducción consiste aproximadamente en un archivo fuente después de que ha sido procesado por el preprocesador C , lo que significa que los archivos de encabezado listados en las #include
directivas están literalmente incluidos , se pueden incluir secciones de código #ifndef
y las macros se han expandido.
Contexto
Un programa en C consiste en unidades llamados archivos de origen (o de preprocesamiento archivos ), que, además de código fuente, incluye directrices para el preprocesador C . Una unidad de traducción es la salida del preprocesador de C, un archivo fuente después de haber sido preprocesado .
El preprocesamiento consiste principalmente en expandir un archivo fuente para reemplazar recursivamente todas las #include
directivas con el archivo literal declarado en la directiva (generalmente archivos de encabezado , pero posiblemente otros archivos fuente); el resultado de este paso es una unidad de traducción de preprocesamiento . Otros pasos incluyen la expansión macro de #define
directivas y la compilación condicional de #ifdef
directivas, entre otros; esto traduce la unidad de traducción de preprocesamiento en una unidad de traducción . A partir de una unidad de traducción, el compilador genera un archivo de objeto , que se puede procesar y vincular (posiblemente con otros archivos de objeto) para formar un programa ejecutable .
Tenga en cuenta que el preprocesador es, en principio, agnóstico del lenguaje y es un preprocesador léxico , que trabaja en el nivel de análisis léxico ; no realiza análisis y, por lo tanto, no puede realizar ningún procesamiento específico de la sintaxis C. La entrada al compilador es la unidad de traducción y, por lo tanto, no ve ninguna directiva de preprocesador, que se ha procesado antes de que comience la compilación. Si bien una unidad de traducción determinada se basa fundamentalmente en un archivo, el código fuente real introducido en el compilador puede parecer sustancialmente diferente del archivo fuente que ve el programador, particularmente debido a la inclusión recursiva de encabezados.
Alcance
Las unidades de traducción definen un alcance , aproximadamente el alcance del archivo y funcionan de manera similar al alcance del módulo ; en la terminología C, esto se conoce como enlace interno , que es una de las dos formas de enlace en C.Los nombres (funciones y variables) declarados fuera de un bloque de funciones pueden ser visibles solo dentro de una unidad de traducción dada, en cuyo caso se dice que tienen un vínculo interno (no son visibles para el vinculador) o pueden ser visibles para otros archivos de objeto, en cuyo caso se dice que tienen un vínculo externo y son visibles para el vinculador.
C no tiene noción de módulos. Sin embargo, los archivos de objeto separados (y, por lo tanto, también las unidades de traducción utilizadas para producir archivos de objeto) funcionan de manera similar a los módulos separados, y si un archivo de origen no incluye otros archivos de origen, el enlace interno (alcance de la unidad de traducción) puede considerarse como "archivo alcance, incluidos todos los archivos de encabezado ".
Organización del código
La mayor parte del código de un proyecto generalmente se guarda en archivos con un .c
sufijo (o .cpp
, .cxx
o .cc
para C ++ , de los cuales .cpp
se usa de manera más convencional). Los archivos que se pretenden incluir suelen tener un .h
sufijo ( .hpp
o .hh
también se utilizan para C ++, pero .h
es el más común incluso para C ++) y, por lo general, no contienen definiciones de funciones o variables para evitar conflictos de nombres cuando los encabezados se incluyen en varios archivos de origen, como es a menudo el caso. Los archivos de encabezado pueden incluirse, y a menudo se incluyen, en otros archivos de encabezado. Es una práctica estándar que todos los .c
archivos de un proyecto incluyan al menos un .h
archivo.