¿Qué es una "unidad de traducción" en C ++

236

En ese momento estaba leyendo el "C ++ efectivo" escrito por Meyers y encontré el término "unidad de traducción".

¿Podría alguien darme una explicación de:

1) ¿Qué es exactamente?

2) ¿Cuándo debería considerar usarlo al programar con C ++?

3) Si está relacionado solo con C ++, o puede usarse con otros lenguajes de programación

Puede que ya lo use sin saber el término ...

Harry
fuente
1
2. Ya está utilizando la unidad de traducción si ha incluido archivos de encabezado. Es un término que se utiliza para la referencia y no una c ++ constructo por decir
talekeDskobeDa

Respuestas:

268

Desde aquí : ( enlace de máquina de wayback )

Según el estándar C ++ ( enlace de máquina de wayback ): una unidad de traducción es la unidad básica de compilación en C ++. Consiste en el contenido de un único archivo fuente, más el contenido de cualquier archivo de encabezado incluido directa o indirectamente por él, menos las líneas que se ignoraron mediante declaraciones de preprocesamiento condicional.

Una sola unidad de traducción puede compilarse en un archivo de objeto, biblioteca o programa ejecutable.

La noción de una unidad de traducción se menciona con mayor frecuencia en los contextos de la Regla de una definición y las plantillas.

JeffH
fuente
99
¿El término se usa solo en C / C ++?
dekuShrub
2
@dekuShrub, de hecho, no. Por ejemplo, en Rust, una unidad de traducción es una caja, en C ++ lo mismo se llamaría una biblioteca completa. El término en sí es universal, pero definitivamente comenzó con C.
Sahsahae
Nueva referencia que establece aproximadamente lo que dice esta respuesta: en.wikipedia.org/wiki/Translation_unit_(programming)
Gabriel Staples
67

Una unidad de traducción es, para todos los efectos, un archivo (.c / .cpp), una vez finalizado, incluidos todos los archivos de encabezado.

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

Ana Betts
fuente
3
Incluyendo archivos de encabezado. El compilador procesa los archivos de encabezado, incluso si no se genera código. Vea también el comentario del preprocesador de JeffH, la definición "todo lo que ve el compilador" es buena.
Marco van de Voort
10
Puede compilar archivos que terminen en ".h" muy bien. El nombre del archivo no es importante en absoluto. El contenido es Si el contenido de "foo.h" es "int main () {}", puede compilarlo.
Johannes Schaub - litb
@LightnessRacesinOrbit: Sí, lo que intentaba decir era que no es ortodoxo compilar directamente un encabezado como una TU, en lugar de compilarlo indirectamente en una TU mediante la inclusión. Eliminó el primer comentario por estar completamente equivocado, manteniendo el segundo para dar a nuestros nuevos contexto.
GManNickG
1
@GManNickG: ¿Qué tal "convencionalmente, los archivos .h no se envían directamente al compilador".
Carreras de ligereza en órbita
@ JohannesSchaub-litb Creo que te refieres al enlace, no a la compilación. Puede compilar cualquier archivo siempre que sea C / C ++ apropiado con todos los nombres definidos. Sería inútil compilar un archivo de encabezado ya que todo el punto de un archivo de encabezado se debe incluir (leer copiado) en los archivos de origen, por lo que ya se compilan cuando compila un archivo de origen que lo incluye. Supongo que lo que querías decir es que no puedes crear un ejecutable a partir de un archivo que no tiene una función principal.
pooya13
30

Una pregunta difícil de responder definitivamente. Los estados estándar de C ++:

El texto del programa se mantiene en unidades llamadas archivos fuente en esta Norma Internacional. Un archivo fuente junto con todos los encabezados (17.4.1.2) y los archivos fuente incluidos (16.2) a través de la directiva de preprocesamiento #include, menos las líneas fuente omitidas por cualquiera de las directivas de preprocesamiento de inclusión condicional (16.1), se denomina unidad de traducción. [Nota: un programa C ++ no necesita ser traducido todos al mismo tiempo. ]

Entonces, para la mayoría de las intenciones y propósitos, una unidad de traducción es un único archivo fuente C ++ y el encabezado u otros archivos que incluye a través del mecanismo de preprocesador #include.

Con respecto a sus otras preguntas:

2) ¿Cuándo debería considerar usarlo al programar con C ++?

No puede no considerarlo: las unidades de traducción son la base de un programa C ++.

3) Si está relacionado solo con C ++, o puede usarse con otros lenguajes de programación

Otros lenguajes tienen conceptos similares, pero su semántica será sutilmente diferente. La mayoría de los otros idiomas no usan un preprocesador, por ejemplo.

Ondrej Slinták
fuente
1
No sé si eso aclara o no. Esta puede ser un área algo turbia: no está claro en el párrafo estándar que cité de que los encabezados precompilados están permitidos, por ejemplo.
1
@GMan, y ahí es donde debes tener mucho cuidado con la regla de una definición. Si incluye una clase en diferentes unidades de traducción con definiciones ligeramente diferentes antes de que se incluya esa clase que causa que la clase tenga un código diferente, causará problemas indefinidos.
Matt Price
66
@GMan tenga en cuenta los dos términos utilizados por el Estándar: "encabezado" y "archivo fuente". "encabezado" solo se utiliza para la biblioteca estándar. Un archivo de usuario incluido por algún código no se denomina "encabezado" por el Estándar, sino "archivo fuente". The Standard no sabe sobre la diferencia entre ".h" y ".cpp" que los pobres programadores de c ++
inventamos
8

El libro lo deja bastante claro. Cuando Meyers se refiere a una "Unidad de traducción", se refiere a un archivo de código fuente.

Ed S.
fuente
1
No. Si estuviera hablando del código fuente, diría archivos fuente. La unidad de traducción se realiza compilando el código fuente. Tenga en cuenta la clara diferencia. Es el código fuente "traducido".
Dan
3
@Dan: No, no lo es. Una unidad de traducción es un archivo fuente que luego se incluye y que se puede compilar, es decir, la salida del preprocesador antes de la compilación.
Ed S.
1
De hecho, a pesar de lo que el estándar C ++ lo llama, "unidad de traducción" se usa comúnmente para comunicar la idea de una sola "Unidad" de código compilado. De hecho, de acuerdo con los compiladores de Microsoft, usted vincula las "Unidades de traducción" directamente. msdn.microsoft.com/en-us/library/vstudio/…
Dan
1
Entonces, ¿estamos tratando de ser nazis "estándar C ++" o estamos tratando de ayudar a las personas a comunicarse con el resto de la industria? Sé que este es un hilo de C ++, así que no entraré en lo que xcode llama tu. O todas las demás definiciones del término.
Dan
1
@Dan: Una unidad de traducción es lo que el estándar lo llama. No estoy realmente preocupado con la opinión de los desarrolladores de compiladores aleatorios. Es interesante que el tipo que desentierra una publicación de casi cinco años para criticar y decirme que mi definición es incorrecta se da la vuelta y me llama un "idioma nazi" para corregir la suya. Yeesh, sigue adelante, estás cansado de tratar.
Ed S.
4

Además de la ODR, la unidad de traducción es importante en la definición de espacios de nombres sin nombre, que reemplaza uno de los viejos usos de "estático".

Supongo que todavía no tengo suficientes puntos para agregar un comentario debajo de la respuesta principal.

Allan Stokes
fuente
3

Una unidad de traducción es el código que se pasa al compilador propiamente dicho. Esto normalmente significa la salida de ejecutar el preprocesador en el archivo .c.

sigjuice
fuente
2

Los programas C y C ++ consisten en uno o más archivos fuente, cada uno de los cuales contiene parte del texto del programa. Un archivo fuente, junto con sus archivos de inclusión (archivos que se incluyen utilizando la directiva de preprocesador #include) pero que no incluye secciones de código eliminadas por directivas de compilación condicional como #if, se denomina "unidad de traducción".

Ganesh Marmat
fuente
1

Según MSDN : los programas C y C ++ constan de uno o más archivos fuente, cada uno de los cuales contiene parte del texto del programa. Un archivo fuente, junto con sus archivos de inclusión (archivos que se incluyen utilizando la directiva de preprocesador #include) pero que no incluye secciones de código eliminadas por directivas de compilación condicional como #if, se denomina "unidad de traducción".

rahul
fuente
0

Cada archivo cpp / c (implementación) se convertirá en encabezados de unidad de traducción (es decir, archivo de objeto (.obj)) en el archivo cpp se reemplazará con el texto real de los archivos de encabezado.

yesraaj
fuente
0

Como han dicho otros, una unidad de traducción es básicamente el contenido de un archivo fuente después del preprocesamiento. Es la producción más importante en la gramática del lenguaje; solo necesitaría preocuparse si estuviera escribiendo un compilador C o C ++.

John Bode
fuente
1
"solo debería preocuparse si estuviera escribiendo un compilador C o C ++". No estoy de acuerdo: los programadores a menudo necesitan entender lo que está haciendo el compilador. Entonces, por ejemplo, necesita saber qué es una unidad de traducción para comprender un punto importante del Artículo # 5 en C ++ efectivo: "el orden relativo de inicialización de objetos estáticos no locales definidos en diferentes unidades de traducción no está definido".
Channing Moore