stringtranslate.com

Unidad de traducción (programación)

En la terminología de los lenguajes de programación C y C++ , una unidad de traducción (o más informalmente, una unidad de compilación) es la entrada final a un compilador de C o C++ desde la 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 de C , lo que significa que los archivos de encabezado enumerados en #includelas directivas están literalmente incluidos , se pueden incluir secciones de código dentro #ifndefy se han expandido las macros.

Contexto

Un programa de C consta de unidades llamadas archivos fuente (o archivos de preprocesamiento ), que, además del código fuente, incluyen directivas para el preprocesador de 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 en expandir un archivo fuente para reemplazar recursivamente todas #includelas directivas con el archivo literal declarado en la directiva (usualmente archivos de encabezado , pero posiblemente otros archivos fuente); el resultado de este paso es una unidad de traducción de preprocesamiento . Los pasos posteriores incluyen la expansión de macro#define directivas y la compilación condicional de #ifdefdirectivas, 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 objeto , que puede procesarse y vincularse posteriormente (posiblemente con otros archivos objeto) para formar un programa ejecutable .

Tenga en cuenta que el preprocesador es, en principio, independiente del lenguaje y es un preprocesador léxico que trabaja en el nivel de análisis léxico ; no realiza análisis sintáctico y, por lo tanto, no puede realizar ningún procesamiento específico de la sintaxis de C. La entrada al compilador es la unidad de traducción y, por lo tanto, no ve ninguna directiva del preprocesador, que se han procesado todas 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 que se introduce en el compilador puede parecer sustancialmente diferente del archivo fuente que ve el programador, en particular 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 de 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 función pueden ser visibles solo dentro de una unidad de traducción dada, en cuyo caso se dice que tienen enlace interno (no son visibles para el enlazador) o pueden ser visibles para otros archivos de objetos, en cuyo caso se dice que tienen enlace externo y son visibles para el enlazador.

C no tiene una noción de módulos. Sin embargo, los archivos de objetos separados (y, por lo tanto, también las unidades de traducción utilizadas para producir archivos de objetos) funcionan de manera similar a los módulos separados, y si un archivo fuente no incluye otros archivos fuente, el enlace interno (ámbito de la unidad de traducción) puede considerarse como "ámbito de archivo, incluidos todos los archivos de encabezado".

Organización del código

La mayor parte del código de un proyecto se almacena normalmente en archivos con un .csufijo (o .cpp, .cxxo .ccpara C++ , que .cppse utiliza de forma más convencional). Los archivos que se pretende incluir suelen tener un .hsufijo ( .hppo .hhtambién se utilizan para C++, pero .hes el más común incluso para C++), y generalmente no contienen definiciones de funciones o variables para evitar conflictos de nombres cuando los encabezados se incluyen en varios archivos de origen, como suele ser 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 .carchivos de un proyecto incluyan al menos un .harchivo.

Véase también

Referencias

  1. ^ ISO/IEC 9899:TC3 - Borrador del Comité de la Norma C99 - Sección 5.1.1.1