Se requiere un poco de apoyo en el idioma (de lo contrario, los compiladores de C/C++ lo harían también)
En particular, se requiere que el compilador genera módulos autónomos, que exponen metadatos a los que otros módulos pueden hacer referencia para llamarlos.
. Los ensamblajes .NET son un ejemplo directo. Todos los archivos de un proyecto se compilan juntos, generando un dll. Dll puede ser consultado por .NET para determinar qué tipos contiene, de modo que otros ensamblados puedan llamar a las funciones definidas en él.
Y para hacer uso de esto, debe ser legal en el lenguaje para hacer referencia a otros módulos.
En C++, ¿qué define el límite de un módulo? El lenguaje especifica que el compilador solo considera los datos en su unidad de compilación actual (archivo .cpp + encabezados incluidos). No hay ningún mecanismo para especificar "Me gustaría llamar a la función Foo en la barra de módulos, aunque no tenga el prototipo ni nada parecido en tiempo de compilación". El único mecanismo que tiene para compartir información de tipo entre archivos es con #includes.
Hay una propuesta para agregar un sistema de módulo a C++, pero no estará en C++ 0x. La última vez que vi, el plan era considerarlo para un TR1 después de que 0x fuera.
(Vale la pena mencionar que el sistema # include en C/C++ fue utilizado originalmente porque había velocidad compilación. En los años 70, permitió que el compilador para procesar el código en un simple escaneo lineal. Se no tenía que crear árboles de sintaxis u otras características "avanzadas". Hoy, las tablas han cambiado y se ha convertido en un gran cuello de botella, tanto en términos de usabilidad como velocidad de compilación).
I * cree * usted me entendió correctamente. Básicamente me refiero a la idea en C/C++ de que cada archivo fuente sea su propia unidad de compilación individual. Esto no parece ser el caso en C# o Java. –