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. Inclusión de encabezados clásicaC y C++ organizan un proyecto en varios archivos de código, más notablemente de estos dos tipos:
Los encabezados no se envían al compilador directamente, sino que son incluidos en archivos de código con la instrucción #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]
Módulos en C++Los módulos incorporados en C++20 presentan una alternativa a la inclusión de encabezados[2] que evita las consecuencias indeseadas mencionadas y mejora la expresividad y modularidad del código. Si bien los módulos resuelven estos problemas, no fueron planteados como una mera alternativa a la inclusión de encabezado sino como una nueva capacidad de C++. Consecuencia de esto, los módulos no pueden desplazar completamente la inclusión de encabezados existentes, aunque sí pueden evitarla completamente para nuevas bibliotecas que aprovechen la nueva capacidad de módulos. En C++20 un módulo[3] es una unidad de traducción con dos particulares relevantes:
A continuación se ilustra el código de un módulo elemental: export module mi_modulo; // nombra el módulo que se define en este archivo
export int suma(int a, int b){return a+b;} // Sólo los elementos exportados serán accesibles or
Un archivo de código que requiera utilizar las definiciones exportadas de un módulo sólo tiene que indicarlo con la instrucción: import mi_modulo; Cabe notar que, a diferencia de Esta forma de programación, muy natural para los programadores, requiere cambios profundos en el compilador, que debe ser capaz de averiguar símbolos ajenos al archivo de código que está compilando. Fragmentos globales y privadosPara mayor flexibilidad C++20 permite que un módulo se desarrolle en varios archivos de código, a los que denomina fragmentos. Incluso permite manejar el nivel de visibilidad de los símbolos exportados como globales o privados, según sean accesibles por todos o solamente por otros fragmentos del mismo módulo. Reemplazo de la inclusión de encabezadosLa instrucción import <iostream>; En este caso No cabe esperar que la inclusión de encabezados de bibliotecas existentes sea reemplazada por módulos, pero sí se espera que nuevas bibliotecas se escriban en términos de módulos en lugar de encabezados, y que la directiva Referencias
Enlaces externos |