Wie sollte ich mein C ++ schreiben, um für C ++ - Module vorbereitet zu sein?
Gibt es bereits zwei Compiler, die Unterstützung von C++ - Modulen:
- 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
Wenn Sie ein neues Projekt beginnen nun, was sollte ich beachten, um der Lage sein zu verabschieden, die die Module bieten, wenn es schließlich freigegeben, in meinem compiler?
Ist es möglich, die Module verwenden, und trotzdem die Kompatibilität mit älteren Compilern nicht unterstützt?
Kommentar zu dem Problem - Öffnen
Ich bin ein wenig eingeschüchtert, eine Antwort zu geben, um eine person mit mehr als 2400 reputationpoints... ^^ ich Frage mich, ist es wirklich wichtig, zu schreiben, jedes mal, wenn ein neues upgrade von c++ ist freigegeben, um das alles zu ändern mein code für die neuen features? Das würde dazu führen, eine Menge von Nebenwirkungen oder architecual verpasst... Wenn ich du wäre würde ich schreiben, dass meine eigenen meta-Sprache, die konstant (oder wo ich mehr Kontrolle über) und ich würde eine Funktion schreiben, die übertragung meiner Sprache in jede andere native Programmiersprache meiner Wahl. Das ist wie die Idee der Virtualisierung von hardware.
@NECIPS SO ist eine knowledge base, Sie sind nicht zu beantworten für mich, aber "die Welt". Wenn jemand fragte mich diese Frage persönlich, ich würde sagen, "Gehen Sie schreiben ein test-Projekt, mit ihm spielen und es herausfinden für sich selbst". Vor einigen Jahren, jemand würde genau das tun und schreiben einen blog-Beitrag darüber. Jetzt bin ich der Hoffnung, jemand schreibt eine Antwort SO.
Vielleicht "Waldo" kann die Antwort auf Ihre Frage (theres-wimmelbuch.ca/2014/07/17/...)
Dies ist ein packaging-problem. Am Ende, ein Modul ist nur eine Sicht auf die ressource. Können Sie die "code-Ressource" als Quelle, bin+.h oder im Modul. Wenn Sie vertraut sind mit packaging systems (CoApp für microsft VSxxx zum Beispiel), sollten Sie nicht Sorge zu viel. Jedenfalls ist der kiey ist immer Ihre hability zu trennen, die Konzepte Ihres Systems ...
Mit den Modulen bedeutet, importieren Sie Sie mit der
import
- Direktive. Ältere Compiler weiß nicht, die import-Direktive. Daher ist es nicht möglich, die Module verwenden, und bleiben abwärtskompatibel. Einige Präprozessor-Tricks können bieten eine Möglichkeit, aber IMO ist es das nicht Wert. InformationsquelleAutor der Frage user7610 | 2016-01-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Microsoft-Ansatz scheint zu sein, das einer gewinnt der die meisten Traktion, vor allem, weil Microsoft zu werfen sind viel mehr Ressourcen bei deren Umsetzung als eine der schrillen folk-aktuell. Sehen https://llvm.org/bugs/buglist.cgi?list_id=100798&query_format=advanced&component=Modules&product=clang für das, was ich meine, es gibt einige große showstopper bugs in Modulen für C++, in der Erwägung, dass die Module für C oder vor allem Objective-C sich viel mehr nutzbar, in der realen Welt code. Visual Studio ist das größte und wichtigste Kunde, Microsoft, treibt hart für die Module, denn er löst eine ganze Tonne interne build-Skalierbarkeit Probleme, und Microsoft ' s internen code wird einige der härtesten C++ zu kompilieren, überall in der Existenz, so dass Sie nicht werfen compiler als MSVC (z.B. viel Glück bekommen clang oder GCC zu kompilieren 40k Online-Funktionen). Also die clang zu bauen tricks, mit der Google etc sind nicht verfügbar, auf Microsoft, und Sie haben eine riesige drücken müssen, um es fest, eher früher als später.
Dies ist nicht zu sagen, es gibt nicht einige gravierende design-Fehler mit dem Microsoft-Vorschlag bei der Anwendung in der Praxis zu großen real-world-code-Basen. Aber Gaby ist der Ansicht, Sie sollte sich umgestalten von code für Module, und während ich nicht einverstanden, ich kann sehen, wo er herkommt.
In so weit, als Microsoft ' s compiler ist derzeit erwartet, dass zur Umsetzung der Module, sollten Sie sicherstellen, dass Ihre Bibliothek ist verwendbar in allen diesen Formen:
Etwas sehr überraschend für viele Menschen ist, dass C++ - Modulen, wie Sie derzeit erwartet umgesetzt werden, hält diese Unterscheidungen, so, jetzt bekommen Sie ein C++ - Modul-Variante für alle drei der oben genannten, mit dem ersten sucht, wie die meisten, was die Leute erwarten, dass ein C++ - Modul zu sein, und die letzten suchen, die meisten wie ein nützlicher vorkompilierten header. Der Grund, Sie sollten auf die Unterstützung dieser Varianten ist, kann man da verwenden die meisten die gleichen Präprozessor-Maschinen für die Unterstützung von C++ - Modulen mit sehr wenig zusätzliche Arbeit.
Einem späteren Visual Studio ermöglichen die Einbindung der Modul-definition-Datei (die .ifc-Datei) als Ressource in DLLs. Dies wird schließlich die Notwendigkeit beseitigen, für die .lib und .dll Unterschied, MSVC, Sie nur der Versorgung einer einzigen DLL, die für den compiler und alles "funktioniert einfach" auf Modul importieren, keine Kopf-oder irgendetwas anderes benötigt. Natürlich riecht ein bisschen wie COM, aber ohne die meisten der Vorteile, die der COM.
Gehe ich davon aus, du meintest den Fett gedruckten text oben eingefügt.
Die Antwort ist in der Regel ja mit noch mehr Präprozessor-makro macht Spaß.
#include <someheader>
wiederum in einimport someheader
im Kopf, weil der Präprozessor noch funktioniert wie gewohnt. Sie können markieren Sie dazu einzelne Bibliothek Header mit C++ - Module-Unterstützung zusammen so etwas wie diese Zeilen:Nun in Ihrem main.cpp oder was auch immer, Sie einfach tun:
... und wenn der compiler hatte /experimental:modules /DMODULES_ENABLED dann ist Ihre Anwendung automatisch verwendet die C++ - Module-edition der Bibliothek. Falls nicht, erhalten Sie die inline-Integration, wie wir es immer getan haben.
Ich denke, dies sind die minimal mögliche Menge von änderungen an den Quell-code, um Ihren code zu Modulen-fertig. Beachten Sie, dass ich nichts gesagt habe über build-Systeme, das ist, weil ich noch Debuggen den cmake-Werkzeuge, die ich geschrieben habe, um alle diese Sachen "einfach so" funktionieren, nahtlos und ich erwarte Debuggen Sie es für einige Monate noch. Zu erwarten, dass es vielleicht an einer C++ Konferenz im nächsten Jahr oder im Jahr danach 🙂
InformationsquelleAutor der Antwort Niall Douglas
Nein, es ist nicht möglich. Könnte es möglich sein, mit einigen
#ifdef
Magie wie diese:aber das heißt, Sie müssen noch zu bieten
.h
Unterstützung und verlieren damit alle Vorteile, plus codebase sieht ziemlich hässlich mittlerweile.Wenn Sie wollen, um diesem Ansatz Folgen, der einfachste Weg, um erkennen "
CXX17_MODULES
", die ich nur aus ist die Erstellung eines kleinen test-Programm, das verwendet Module mit einer build-system Ihrer Wahl, und definieren Sie einen globalen, für alle sichtbar, zu sagen, ob die Zusammenstellung gelungen ist oder nicht.Kommt es an. Wenn Ihr Projekt enterprise und bekommt Sie Essen auf dem Teller, ich würde ein paar Jahre warten, sobald es veröffentlicht wird, die in den Ställen, so dass es wird weithin angepasst. Auf der anderen Seite, wenn Ihr Projekt leisten kann, bleeding-edge, mit allen Mitteln, die Module verwenden.
Im Grunde ist es die gleiche Geschichte ast mit Python ist3 und Python2 oder weniger relevant, PHP7 und PHP5. Sie müssen eine balance finden zwischen einer guten up-to-date-Programmierer und keine nervigen Leute, die auf Debian 😉
InformationsquelleAutor der Antwort rr-