Si richiede un po 'di supporto per la lingua (in caso contrario, C/C++ compilatori lo farebbero troppo)
In particolare, si richiede che il compilatore genera moduli autonomi, che espongono i metadati che altri moduli possono fare riferimento per chiamarli.
Gli assembly .NET sono un esempio semplice. Tutti i file in un progetto sono compilati insieme, generando una dll. Questa DLL può essere interrogata da .NET per determinare quali tipi contiene, in modo che altri assembly possano chiamare funzioni definite in esso.
E per fare uso di questo, deve essere legale nella lingua per fare riferimento ad altri moduli.
In C++, cosa definisce il limite di un modulo? La lingua specifica che il compilatore considera solo i dati nella sua unità di compilazione corrente (file .cpp + intestazioni incluse). Non c'è alcun meccanismo per specificare "Mi piacerebbe chiamare la funzione Foo nella barra del modulo, anche se non ho il prototipo o qualcosa per esso in fase di compilazione". L'unico meccanismo che hai per condividere le informazioni sul tipo tra i file è con #include.
C'è una proposta per aggiungere un sistema di moduli a C++, ma non sarà in C++ 0x. L'ultima volta che ho visto, il piano era considerarlo per un TR1 dopo che 0x è uscito.
(Vale la pena ricordare che il sistema # include in C/C++ è stato originariamente utilizzato perché aveva accelerare compilazione. Negli anni '70, ha permesso al compilatore di elaborare il codice in una scansione semplice e lineare. E ' non è stato necessario creare alberi di sintassi o altre funzionalità "avanzate". Oggi le tabelle si sono trasformate ed è diventato un enorme collo di bottiglia, sia in termini di usabilità che di velocità di compilazione.)
I * credi * mi hai capito bene. Fondamentalmente intendo l'idea in C/C++ che ogni file sorgente sia una propria unità di compilazione. Questo non sembra essere il caso in C# o Java. –