programa - ¿Cómo se define la unidad de compilación en c++?
proceso de compilacion y ejecucion en c++ (3)
El compilador solo procesa los archivos de origen, generalmente con la extensión .c o .cpp. El compilador no se preocupa realmente por los archivos que se incluyen: en la medida en que generalmente se implementa el compilador, cada archivo .c / .cpp se procesa nuevamente, independientemente de los archivos .h que se lean (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.
Posible duplicado:
¿Qué es una "unidad de traducción" en C ++
¿Se suele decir que las variables estáticas declaradas en C / C ++ no son visibles en las unidades de compilación? ¿Significa esto que cada archivo .c o .cpp es una unidad de compilación separada? ¿Qué pasa con un archivo, 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?
La compilación de C y C ++ se divide (generalmente) en tres pasos independientes:
- Preproceso, involucrando macro y #incluir expansiones.
- Compilar, convertir código fuente en código binario y generar archivos de objetos intermedios.
- Enlace, uniendo los archivos de objetos en un solo archivo ELF o EXE.
Donde quiera que haya un #include
o una macro, el preprocesador expande esa expresión con el valor real. En el caso de un #include
que toda la línea se reemplaza con el contenido del archivo .h.
El compilador real (generalmente) no tiene conocimiento de ningún archivo de encabezado, ve una unidad de compilación como un gran archivo .c o .cpp.
La parte "usualmente" proviene del hecho de que algunos compiladores optimizan la inclusión del encabezado al almacenar un encabezado precompilado en algún tipo de caché, pero el efecto es el mismo.
Los archivos de encabezado no tienen vida propia, solo su contenido se incluye en los archivos .c o .cpp. Pero como #include
es manejado por el preprocesador, el compilador no tiene conocimiento sobre los distintos archivos de encabezado; solo ve el código resultante como entrada. Esto es lo que se llama una unidad de compilación : un archivo fuente con todas sus directivas #include
reemplazadas por el contenido de los archivos de encabezado relevantes.