2009-07-09 10 views
178

Estoy leyendo en ese momento el "C++ efectivo" escrito por Meyers y encontré el término "unidad de traducción".¿Qué es una "unidad de traducción" en C++

Podría alguien por favor, dame una explicación de:

1) ¿Qué es exactamente lo

2) ¿Cuándo debería considerar usarlo en la programación con C++

3) Si se relaciona únicamente a C++, o puede ser utilizado con otros lenguajes de programación

ya lo podría utilizar sin conocer el término ....

Respuesta

206

De here: (wayback machine link)

Según standard C++ (wayback machine link): Una unidad de traducción es la unidad básica de compilación en C++. Consiste en el contenido de un único archivo de origen, más los contenidos de cualquiera de los archivos de cabecera directa o indirectamente comprendidos por ella, menos aquellas líneas que fueron ignorados utilizando pre-procesamiento condicional declaraciones.

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

La noción de una unidad de traducción es mencionado con más frecuencia en los contextos de la Regla una definición, y plantillas.

52

Un tr La unidad de conversión es para todos los efectos un archivo (.c/.cpp), después de que ha finalizado incluyendo todos los archivos de cabecera.

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

+3

Incluyendo archivos de encabezado. Los archivos de encabezado son procesados ​​por el compilador, incluso si no se genera código. Ver también el comentario del preprocesador de Jeff, la definición "todo lo que el compilador ve" es buena. –

+9

Puede compilar archivos que terminan en ".h" bien. El nombre de archivo no es importante en absoluto. El contenido es Si el contenido de "foo.h" es "int main() {}", puede compilarlo. –

+0

@LightnessRacesinOrbit: Sí, lo que estaba tratando de decir es que no es ortodoxo compilar directamente un encabezado como TU, en lugar de compilarlo indirectamente en una TU mediante inclusión. Se eliminó el primer comentario por ser completamente incorrecto, manteniendo el segundo para dar contexto a nuestros nuevos. – GManNickG

7

El libro hace que sea lo suficientemente claro. Cuando Meyers se refiere a una "Unidad de traducción", se refiere a un archivo de código fuente.

+1

No. Si hablaba del código fuente, él diría los archivos fuente.La unidad de traducción se crea compilando el código fuente. Tenga en cuenta la clara diferencia. Es un código fuente "traducido". – Dan

+1

@Dan: No, no lo es. Una unidad de traducción es un archivo de origen que incluye * qué * se puede compilar, es decir, la salida del preprocesador antes de la compilación. –

+0

Preprocesador que simplemente forma parte del proceso de compilación. No significaba modificar tu pico, pero cuando hablas de una "Unidad de traducción" hay una clara diferencia entre lo que ha sido preprocesado y lo que no. No son nombres intercambiables. Y ese es mi punto. – Dan

3

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

0

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

23

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

El texto del programa se guarda en unidades denominadas archivos fuente en esta norma internacional. Un archivo de origen junto con todas las cabeceras (17.4.1.2) y archivos de código fuente incluido (16.2) a través de la directiva #include procesamiento previo, menos las líneas de origen omitidas por cualquiera de los inclusión condicional (16.1) preprocesamiento direc- tivos , se llama una unidad de traducción.[Nota: un programa C++ no necesita ser traducido al al mismo tiempo. ]

Por lo tanto, para la mayoría de los propósitos, una unidad de traducción es un único archivo fuente C++ y el encabezado u otros archivos que incluye mediante el mecanismo #include del preprocesador.

En cuanto a sus otras preguntas:

2) ¿Cuándo debería considerar el uso que en la programación con C++

No se puede no considera - unidades de traducción son la base de un C++ programa.

3) Si se relaciona únicamente con C++, o se puede utilizar con otros programas de idiomas

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

+0

No sé si eso aclara o no. Esto puede ser un área un tanto turbia; no está claro en el estándar para el que cité que los encabezados precompilados están permitidos, por ejemplo. –

+0

@GMan, y ahí es donde tienes que 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 incluir esa clase que causa que la clase tenga un código diferente, causará problemas indefinidos. –

+5

@GMan tenga en cuenta los dos términos utilizados por el estándar: "encabezado" y "archivo de origen". "encabezado" solo se usa para la biblioteca estándar. Un archivo de usuario que está incluido en algún código no es llamado "encabezado" por el Estándar, sino "archivo fuente". El estándar no sabe acerca de la diferencia entre ".h" y ".cpp" que los programadores pobres de C++ inventaron :) –

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 alta en la gramática del lenguaje; solo tendrías que preocuparte si estuvieras escribiendo un compilador C o C++.

+0

"solo tendría que preocuparse si estuviera escribiendo un compilador C o C++". No estoy de acuerdo: los programadores a menudo necesitan comprender lo que hace el compilador. Entonces, por ejemplo, necesita saber qué es una unidad de traducción para comprender un punto importante del Item # 5 en Effective C++: "el orden relativo de inicialización de objetos estáticos no locales definidos en diferentes unidades de traducción no está definido". –

1

Según MSDN: 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 con la directiva del preprocesador #include) pero sin incluir las secciones de código eliminadas por las directivas de compilación condicional, como #if, se denomina "unidad de traducción".

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 usos antiguos de "estática".

Supongo que todavía no tengo suficientes puntos para agregar un comentario en la parte superior de la respuesta.

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 con la directiva del preprocesador #include) pero sin incluir las secciones de código eliminadas por las directivas de compilación condicional, como #if, se denomina "unidad de traducción".

Cuestiones relacionadas