Bei der Verwendung von C++ – Modulen, die aus irgendeinem Grund zu trennen, Funktionsdeklarationen (.hpp-Dateien) von Ihrer Definitionen (.cpp-Dateien)?

Ich bin verwendet, um code zu schreiben, ohne Module, wo die header-Dateien enthalten Deklarationen wie:

//foo.h 
class Foo
{
    void bar();
};

und die entsprechenden .cpp-Datei enthält die definition:

//foo.cpp
#include "foo.h"

void Foo::bar()
{
    //...
}

Meines Wissens geschieht dies, um Abnahme compile-Zeit und reduzieren die Abhängigkeiten. Wenn Module verwendet wird, wird dies noch gelten? Wäre es nur so schnell zu haben die Klasse in einer einzelnen Datei mit den Definitionen der Art und Weise Java und C# funktioniert es? Wenn dies der Fall ist, wird es keine Notwendigkeit für beide .hpp und .cpp – Dateien, wenn die Module?

  • Wie werden Sie auf eine Funktion? Wenn Sie #include für die kombinierten Kopf-und .cpp-Datei, die Sie multiplizieren der Definition von Funktionen.
InformationsquelleAutor Phlox Midas | 2016-09-23



4 Replies
  1. 3

    Der einzige Grund, ich bin mir bewusst, da die Module Vorschlag derzeit steht, ist in der Lage zirkuläre Schnittstelle Abhängigkeiten.

    Wenn ein Programm besteht aus Modulen und es keine separate Deklarationen von Definitionen, die alle Modul-Dateien werden mit der Modul-Schnittstellen (im Gegensatz zu Modul-Implementierungen). Wenn Sie möchten, um Sie zu vergleichen, um header-und code-Dateien, Modul-Schnittstellen könnte man als den header (.hpp) – Datei-und Modul-Implementierungen angesehen werden könnte, den code (.cpp) – Dateien.

    Leider die Module Vorschlag nicht erlauben, zyklische Modul-interface-Abhängigkeiten. Und da Ihr Programm ist nun vollständig von Modul-Schnittstellen, daher werden Sie nie in der Lage sein, um zwei Module, die voneinander abhängig in irgendeiner Weise (dies kann verbessert werden, indem die proclaimed ownership Erklärung in der Zukunft, aber dies ist momentan nicht unterstützt). Die einzige Möglichkeit zum lösen Runder Modul-Schnittstelle Abhängigkeiten ist durch die Trennung von Deklarationen und Definitionen, und dabei den kreisförmigen Importe in der Modul-Implementierung-Dateien, im Gegensatz zu kreisförmigen Modul-Schnittstelle Abhängigkeiten, Runder Modul Implementierung Abhängigkeiten sind erlaubt.

    Folgende code zeigt ein Beispiel für eine situation, die unmöglich ist, zu kompilieren, ohne Trennung von Deklarationen und Definitionen:

    Foo module file

    export module Foo;
    
    import module Bar;
    
    export namespace Test {
        class Foo {
        public:
            Bar createBar() {
                return Bar();
            }
        };
    }

    Bar module file

    export module Bar;
    
    import module Foo;
    
    export namespace Test {
        class Bar {
        public:
            Foo createFoo() {
                return Foo();
            }
        };
    }

    Dieser Artikel zeigt ein Beispiel, wie dies gelöst werden könnte, wurden die proclaimed ownership Erklärung zur Verfügung. Im wesentlichen geht es um die Trennung von Deklarationen und Definitionen.

    In einer perfekten Welt würde der compiler in der Lage sein, um dieses Szenario zu behandeln, aber ach, wie weit ich bin mir bewusst, dass die aktuelle vorgeschlagen, die Umsetzung der Module nicht unterstützt.

    • Ich sah nie zirkuläre Abhängigkeiten als etwas wünschenswert. Vielmehr habe ich es als design-problem. In diesem Sinne ist es sogar eine gute Idee, dies zu unterstützen?
    • Ich Stimme mit Ihnen überein, dass zirkuläre Abhängigkeiten kann auf ein design-Problem, aber dies ist nicht immer der Fall ist – und manchmal ist es einfach schwer zu vermeiden, zirkuläre Abhängigkeiten. Betrachten Sie das Szenario, wo man einen Baum von Knoten, wo jeder Knoten würde gerne auf die Eltern und Kinder. Dies erzeugt einen Zirkelbezug. Dies gilt für so ziemlich alle Eltern <-> Kind-Beziehung, wie zum Beispiel ein Spieler und Item-Klasse, wo die Player-Klasse bezieht sich die Elemente und die Element-Klasse bezieht seine Besitzer.
  2. 2

    Gibt es eine nette Diskussion hier, erklärt, dass die Idee der Module.

    Kurz gesagt du hast Recht, die Trennung zwischen header-Dateien und die Umsetzung Dateien werden nicht mehr benötigt. Die #include Richtlinie wird ersetzt durch die import Richtlinie, und bei der Kompilierung des Moduls wird die erforderlichen Informationen, die sonst in den mitgelieferten header-Datei.

  3. 2

    Gibt es noch viele Gründe für die Verwendung von header-Dateien.

    Die Leichtigkeit des Teilens und Verständnis eine Objekt-api, ohne dass die zugrunde liegenden Daten ist genug nutzen, um Sie ringsherum zu behalten. Es ist ein gut 20 m Sicht auf ein Objekt, im wesentlichen eine Gliederung.

    Wenn Sie verkauft werden, eine Bibliothek, Sie würde eine header-Datei, als auch als Archiv-Datei oder eine gemeinsam genutzte Bibliothek. Auf diese Weise halten Sie proprietäre Informationen, ohne die IP von dem Produkt, und Ihre Kunden können eine binäre zusammengestellt für Ihr Ziel.

    Ich glaube nicht, dass dies möglich ist, ohne den header-Dateien.

  4. 1

    Eine andere Verwendung dieses idiom ist geerbt von C; es ist ein bequemes Mittel der forward-Deklaration auch für übersetzungseinheiten, die keine Abhängigkeiten von anderen übersetzungseinheiten.

    Die Verwendung von vorkompilierten Headern nicht wirklich eine wichtige Sache, bis C++’s erweiterte Nutzung der header-Dateien, die es notwendig machte, sich aus Gründen der Leistung (trotz einiger sehr großes old-school-Header wie windows.h).

    Die Idee scheint zu sein, bringen Sie etwas mehr wie die C# – /Java-Mechanismus ins Spiel. Die C++ – Mechanismus ist sehr Modula/ADA im Geist. Es wäre schön, wenn die Maschinen mehr Arbeit für uns.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.