Ci sono già due compilatori che supportano moduli C++
clang: http://clang.llvm.org/docs/Modules.html MS VS 2015: http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx
l'approccio di Microsoft sembra essere quello guadagnando più trazione, soprattutto perché Microsoft stanno gettando molte più risorse a loro implementazione di qualsiasi della gente clang attualmente. Vedi https://llvm.org/bugs/buglist.cgi?list_id=100798&query_format=advanced&component=Modules&product=clang per quello che voglio dire, ci sono alcuni grandi bug di showstopper in Modules per C++, mentre i Modules per C o specialmente Objective C sembrano molto più utilizzabili nel codice del mondo reale. Il cliente più grande e importante di Visual Studio, Microsoft, sta spingendo molto per i Modules perché risolve un sacco di problemi di scalabilità interna del build e il codice interno di Microsoft è tra i C++ più difficili da compilare ovunque, quindi non è possibile lanciare alcun compilatore ad eccezione di MSVC (ad es. buona fortuna per ottenere clang o GCC per compilare le funzioni di linea a 40k).Pertanto i trucchi di build clang utilizzati da Google, ecc., Non sono disponibili per Microsoft e hanno un enorme bisogno urgente di risolverlo prima piuttosto che dopo.
Questo non vuol dire che non ci siano gravi difetti di progettazione con la proposta di Microsoft se applicati in pratica a grandi basi di codice del mondo reale. Comunque Gaby è del parere che dovresti refactoring il tuo codice per Modules, e mentre non sono d'accordo, posso vedere da dove viene.
All'avvio di un nuovo progetto, a cosa devo prestare attenzione per poter adottare la funzionalità dei moduli quando verrà rilasciata nel mio compilatore?
Nella misura in cui il compilatore di Microsoft è attualmente previsto per implementare i moduli, si dovrebbe assicurarsi che la libreria è utilizzabile in tutte queste forme:
- libreria dinamica
- libreria statica
- Solo libreria di intestazione
Qualcosa di molto sorprendente per molte persone è che i moduli C++ come attualmente dovrebbero essere imp lemented mantiene quelle distinzioni, quindi ora si ottiene una variante del modulo C++ per tutte e tre le di cui sopra, con la prima che assomiglia alle persone che si aspettano un modulo C++, e l'ultima sembra più un'intestazione precompilata più utile. La ragione per cui dovresti supportare queste varianti è che puoi riutilizzare la maggior parte degli stessi macchinari per il preprocessore per supportare anche i moduli C++ con pochissimo lavoro extra.
Un Visual Studio successivo consentirà il collegamento del file di definizione del modulo (il file .ifc) come una risorsa nelle DLL. Questo eliminerà definitivamente la necessità della distinzione .lib e .dll su MSVC, basta fornire una sola DLL al compilatore e tutto funziona "semplicemente" sull'importazione del modulo, senza intestazioni o altro. Questo ovviamente odora un po 'come la COM, ma senza la maggior parte dei vantaggi di COM.
E 'possibile utilizzare i moduli in una singola base di codice ed ancora mantenere la compatibilità con i compilatori più vecchi che non lo supportano?
Presumo che intendessi il testo in grassetto inserito sopra.
La risposta è generalmente sì con ancora più divertimento macro preprocessore. #include <someheader>
può trasformarsi in import someheader
nell'intestazione perché il preprocessore funziona ancora come al solito. È quindi possibile contrassegnare fino singole intestazioni di libreria con il supporto ++ Moduli C insieme qualcosa come queste righe:
// someheader.hpp
#if MODULES_ENABLED
# ifndef EXPORTING_MODULE
import someheader; // Bring in the precompiled module from the database
// Do NOT set NEED_DEFINE so this include exits out doing nothing more
# else
// We are at the generating the module stage, so mark up the namespace for export
# define SOMEHEADER_DECL export
# define NEED_DEFINE
# endif
#else
// Modules are not turned on, so declare everything inline as per the old way
# define SOMEHEADER_DECL
# define NEED_DEFINE
#endif
#ifdef NEED_DEFINE
SOMEHEADER_DECL namespace someheader
{
// usual classes and decls here
}
#endif
Ora nel tuo main.cpp o qualsiasi altra cosa, è sufficiente fare:
#include "someheader.hpp"
... e se il compilatore aveva/experimental: modules/DMODULES_ENABLED quindi l'applicazione utilizza automagicamente l'edizione dei moduli C++ della tua libreria. In caso contrario, si ottiene l'inclusione in linea come sempre.
Ritengo che queste siano la serie minima possibile di modifiche al codice sorgente per rendere il codice pronto per i moduli ora.Noterete che non ho detto nulla sui sistemi di build, questo perché sto ancora eseguendo il debug degli strumenti di cmake che ho scritto per far sì che tutto questo funzioni semplicemente "lavoro" e mi aspetto di eseguire il debugging per alcuni mesi ancora. Aspettiamo di vederlo magari durante una conferenza C++ il prossimo anno o l'anno dopo :)
Sono un po 'intimorito di dare una risposta a una persona con più di 2400 punti reputazione ... ^^ Mi chiedo che sia davvero importante scrivere ogni volta quando viene rilasciato un nuovo aggiornamento di C++ per cambiare tutto il mio codice nelle nuove funzionalità? Ciò causerebbe un sacco di effetti collaterali o modifiche architetturali ... Se fossi in te, scriverò il mio metanaggio che sarebbe costante (o dove avrò più controllo) e scriverei una funzione per trasferire la mia lingua in qualsiasi altro linguaggio di programmazione nativo della mia scelta. Questa è come l'idea di una virtualizzazione dell'hardware. –
@NECIPS SO è una base di conoscenza, non mi stai rispondendo, ma "per il mondo". Se qualcuno mi ha fatto questa domanda di persona, direi "Vai a scrivere un progetto di prova, gioca con esso e scoprilo da solo". Pochi anni fa qualcuno avrebbe fatto proprio questo e avrebbe scritto un post sul blog. Ora spero che qualcuno scriverà una risposta SO. – user7610
Forse "Waldo" può rispondere alla tua domanda (http://theres-waldo.ca/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/) –