Módulos (C++)
El concepto de programación modular es adoptado por la mayoría de los lenguajes modernos, con la notable excepción de C, y C++ antes de la versión C++20. Estos dos lenguajes usan un preprocesador para incluir encabezados con declaraciones, una técnica que data de la década del 1970, hoy superada universalmente por el uso de módulos. C++20 incorpora módulos, introduciendo por primera vez una alternativa real a la inclusión de encabezados y que permite evitar totalmente el uso del preprocesador.
From Wikipedia, the free encyclopedia
El concepto de programación modular es adoptado por la mayoría de los lenguajes modernos, con la notable excepción de C, y C++ antes de la versión C++20. Estos dos lenguajes usan un preprocesador para incluir encabezados con declaraciones, una técnica que data de la década del 1970, hoy superada universalmente por el uso de módulos.
C++20 incorpora módulos, introduciendo por primera vez una alternativa real a la inclusión de encabezados y que permite evitar totalmente el uso del preprocesador.
C y C++ organizan un proyecto en varios archivos de código, más notablemente de estos dos tipos:
- código, con extensiones
.co.cpp(entre otras), que se compilan y generan "unidades de traducción" - encabezados (headers), con extensiones
.ho.hpp(entre otras), que no se compilan y no generan unidades de traducción
Los encabezados no se envían al compilador directamente, sino que son incluidos en archivos de código con la instrucción #include de preprocesador como ésta:
#include <stdio.h>
El preprocesador copia y pega el contenido del archivo encabezado en el código justo antes de compilar (el resultado del preprocesamiento se compila pero no se guarda). Algunas consecuencias indeseadas:[1]
- el compilador vuelve a procesar el código del mismo encabezado por cada vez que se incluya en diferentes archivos de código, provocando un retrabajo inútil
- por lo anterior y para satisfacer la regla de definición única, el archivo encabezado que será procesado varias veces no puede tener la definición de sus funciones, sino sólo su declaración, lo que obliga a separar el código en un archivo encabezado y otro de código
- para evitar las redeclaraciones, los encabezados deben usar guardas