2011-02-14 31 views
15

Duplicar posible:
What is a “translation unit” in C++¿Cómo se define la unidad de compilación en C++?

A menudo se dice que las variables estáticas declaradas en C/C++ no son visibles a través de las unidades de compilación? ¿Esto significa que cada archivo .c o .cpp es una unidad de compilación separada? ¿Qué tal un archivo a, h y las variables estáticas declaradas en el archivo .h? ¿El archivo .h también se considera como una unidad de compilación separada?

+0

Posible duplicado: http://stackoverflow.com/questions/1106149/what-is-a-translation-unit-in-c – Flexo

+6

Técnicamente un duplicado, pero eso supone que usted sabe que una "unidad de compilación" es la lo mismo que una "unidad de traducción". – MSalters

Respuesta

27

Los archivos de encabezado no tienen una vida separada, solo su contenido es #included en archivos .c o .cpp. Pero dado que el #include es manejado por el preprocesador, el compilador no tiene conocimiento sobre los distintos archivos de encabezado; solo ve la entrada del código resultante como entrada. Esto es lo que se llama unidad de compilación : un archivo fuente con todas sus directivas #include reemplazadas por el contenido de los archivos de cabecera relevantes.

+1

Esta pregunta podría interpretarse como duplicada, pero la respuesta es mucho más instructiva que la respuesta a la pregunta original – user9589

+0

... menos las líneas excluidas por las directivas de preprocesador condicional. –

4

El compilador solo procesa archivos de origen, generalmente con la extensión .c o .cpp. El compilador realmente no se preocupa por los archivos que se incluyen: en la medida en que el compilador generalmente se implementa, cada archivo .c/.cpp se procesa de nuevo, sea cual sea el archivo .h que se lea (cortesía del preprocesador).

Es por eso que hablamos de "unidades de compilación": algo que se compila de una vez, cuyos resultados se pueden vincular posteriormente en ejecutables.

8

C y C++ compilación es (normalmente) dividido en tres etapas independientes:

  • preprocesamiento, que implica expansiones macro y # include.
  • Compilando, convirtiendo el código fuente en código binario y generando archivos de objetos intermedios.
  • Enlazando, uniendo los archivos del objeto en un solo archivo ELF o EXE.

Donde hay una #include o una macro, el preprocesador expande que la expresión con el valor real. En el caso de #include, toda la línea se reemplaza con el contenido del archivo .h.

El compilador real (normalmente) no tiene conocimiento de ningún archivo de encabezado, ve una unidad de compilación como un gran archivo .c o .cpp.

La parte "habitual" proviene del hecho de que algunos compiladores optimizan la inclusión de encabezados almacenando un encabezado precompilado en algún tipo de caché, pero el efecto es el mismo.

Cuestiones relacionadas