programas librerias ejemplos dev completo comandos basicos basico c++ c++11 module standards language-extension

librerias - Módulos C++: ¿por qué se eliminaron de C++ 0x? ¿Volverán más tarde?



manual completo de c++ pdf (4)

Borrador de los módulos de C ++ (Especificación técnica después de C ++ 17)

Un borrador y varias revisiones actualizadas para la especificación del módulo C / C ++ han sido publicadas por WG21 en open-std.org. Voy a vincular solo a los últimos documentos aquí:

  • Borrador de trabajo, extensiones a C ++ para los módulos N4610 (octubre de 2016).
  • Cuarta revisión publicada como P0142R0 (marzo de 2016).
  • Redacción de los módulos publicados como P0143R2 (marzo de 2016).
  • El equipo de clang ha publicado una segunda revisión de sus cambios: P0273R1 (octubre de 2016).

Las siguientes publicaciones de blog contienen un resumen de las reuniones de estándares y, en particular, un resumen del estado actual del borrador de los módulos:

Actualización: como se explica en el informe de viaje de Kona al que me he vinculado anteriormente, actualmente hay dos propuestas en competencia, una de Microsoft y otra de Clang. La solución propuesta de Microsoft no permite exportar macros, mientras que la solución del equipo de Clang admitiría exportar macros. Hasta ahora, solo Microsoft ha presentado formalmente un borrador para una especificación de módulo.

Especificación del módulo según lo propuesto por Microsoft

Aquí hay una descripción general rápida de los conceptos más importantes que contiene esta propuesta. Como es un borrador, esto posiblemente aún cambie. El nuevo estándar de módulos consistirá, entre otras cosas, en lo siguiente:

Una palabra clave de module para declarar un módulo, varios archivos pueden declarar esto para construir un módulo (pero para cada módulo, solo una unidad de compilación puede contener una sección de export {} ):

module M;

Una palabra clave de importación para importar módulos, en lugar de import , también se puede decidir utilizar en su lugar el using module , por lo que se podría evitar una nueva palabra clave de importación.

import std.io; import module.submodule;

Una sintaxis de export , que define las declaraciones públicas que forman parte de este módulo, las declaraciones que no son de interfaz y que no deberían exportarse como parte del módulo se definirán fuera del bloque de exportación. Las declaraciones pueden ser cualquier tipo de declaración en C / C ++, es decir, no solo funciones, sino también variables, estructuras, plantillas, espacios de nombres y clases:

export { int f(int); double g(double, int); int foo; namespace Calc { int add(int a, int b); } } void not_exported_function(char* foo);

Un cambio importante en los módulos será que las macros y las definiciones de los preprocesadores serán locales a los módulos y no se exportarán. Por lo tanto, las macros no tienen ningún impacto en los módulos importados:

#define FILE "my/file" import std.io; //will not be impacted by the above definition

Es importante señalar que tanto el sistema preprocesador actual como los módulos podrán coexistir y que los encabezados se pueden usar, por ejemplo, para incluir macros.

Para obtener información más detallada, sugiero leer el borrador.

Clang Modules

Clang ha estado trabajando en una implementación de módulos que se puede encontrar en la página de módulos clang . Sin embargo, clang actualmente no implementa una sintaxis concreta para los módulos, es decir, ninguna de las sintaxis mencionadas anteriormente ha sido implementada por Clang. Para explicar esto, la página contiene la siguiente declaración:

Actualmente, no hay sintaxis C o C ++ para las declaraciones de importación. Clang rastreará la propuesta de módulos en el comité de C ++. Consulte la sección Incluye como importaciones para ver cómo se importan los módulos hoy.

La parte principal que Clang implementa actualmente es el "Lenguaje de mapas de módulos" que permite crear mapas de módulos para códigos existentes que aún usan archivos de encabezado.

Macro exportaciones de módulos

Como se mencionó anteriormente, aún no está claro si las exportaciones macro formarán parte de los Módulos finales TS . En P0273R1 se propuso la siguiente sintaxis para la exportación de macros:

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

Acabo de descubrir este viejo borrador de C ++ 0x sobre módulos en C ++ 0x.

La idea era salir del sistema .h / .cpp actual escribiendo solo archivos .cpp que luego generarían archivos de módulo durante la compilación, que a su vez serían utilizados por los otros archivos .cpp.

Esto parece una gran característica.

Pero mi pregunta es: ¿por qué lo eliminaron de C ++ 0x? ¿Fue por demasiadas dificultades técnicas? ¿Falta de tiempo? ¿Y crees que considerarán trabajar en ello para una versión ulterior de C ++?


  1. Porque es un cambio conceptual muy grande.
  2. No existe una necesidad real ya que la separación de las fuentes a h / cpp hace el trabajo
  3. Porque C ++ no define cómo se compilan las bibliotecas de "módulos" reales. Lo deja al desarrollador del compilador y al enlazador.
  4. Los "módulos" a veces son bastante dependientes de la plataforma, por ejemplo, DLL bastante diferentes de los objetos compartidos. Entonces, no es tan trivial fusionar estos conceptos.

Clang es el primer compilador que comienza a trabajar en los módulos incluso antes de que se complete la estandarización. Todavía no hay mucha documentación, pero el código de ejemplo se puede encontrar aquí:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Algunos comentarios de Douglas Gregor (el desarrollador que los implementa):
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

En teoría, puede definir un conjunto de macros auxiliares como begin_module, end_module, import_module para protegerse de posibles cambios en la sintaxis que vendrá en el futuro.

EDIT 1:
Douglas Gregor ha publicado una presentación sobre su implementación:
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDICION 2:
El soporte del módulo en clang se ha documentado aquí:
http://clang.llvm.org/docs/Modules.html

EDIT 3:
Los módulos ahora también son compatibles con el compilador C ++ de Microsoft: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx


Desde el Estado de C + + Evolution (Post San Francisco 2008) , la propuesta de Módulos fue categorizada como "Encabezado para un TR separado:"

Estos temas se consideran demasiado importantes como para esperar otro estándar después de C ++ 0x antes de publicarse, pero son demasiado experimentales para finalizar a tiempo para el próximo Estándar. Por lo tanto, estas características se entregarán mediante un informe técnico a la primera oportunidad.

La propuesta de los módulos simplemente no estaba lista y esperarla hubiera retrasado la finalización del estándar C ++ 0x. En realidad no se eliminó, simplemente nunca se incorporó al documento de trabajo.