2009-09-10 13 views
25

Ich habe eine Reihe von C++ - Header-Dateien mit verschiedenen Klassen- und Funktionsdeklarationen. So weit, als ich die C++ - Quelldatei-Implementierungen der deklarierten Klassen und Funktionen geschrieben habe, war ich manuell:Automatisch C++ - Datei aus dem Header generieren?

  • Kopieren Sie die Deklarationen aus der Header-Datei in die entsprechende Quelldatei.
  • Löschen von "class classname {" und das passende "};"
  • Hinzufügen von "classname ::" auf die Namen aller Klassenfunktionen.
  • Ersetzen Sie die Semikolons nach den Funktionsdeklarationen durch "{}".
  • Löschen der Schlüsselwörter "virtual" und "static".
  • Erst nach all der Arbeit, die eigentlich gar nichts macht, kann ich tatsächlich die Funktionen umsetzen. Ich frage mich, ob es irgendwo ein Tool gibt, das automatisch eine ".cpp" -Datei aus einer ".h" -Datei erzeugen kann, wobei die resultierende ".cpp" leere Stubs für die in der ".h" -Datei deklarierten Funktionen enthält (und für die eine Inline-Definition nicht angegeben wurde). Ein UNIX-freundliches Kommandozeilen-Tool wäre vorzuziehen. Vielen Dank.

    UPDATE: Ein Cross-Plattform-Tool wäre ideal. Wenn nicht, arbeite ich an Mac OS X 10.6.

    Antwort

    21

    Lazy C++ scheint genau dieses Problem zu adressieren.

    +0

    Lazy C++ scheint auf Mac OS X nicht installiert zu sein ... was ich verwende. Gibt es plattformübergreifende Generatoren, von denen Sie wissen, dass sie leicht aus der Quelle erstellt werden können? –

    +1

    +1 Sehr interessante Ressource. –

    +1

    @Michael: Sie können die Quelle greifen und für OSX Cross-kompilieren, siehe z. Antwort auf http: // stackoverflow.com/Fragen/1375201/Lazy-C-Huhn-und-Ei-Problem – moonshadow

    3

    Die eclipse CDT verfügt über eine "Implement-Methode" -Funktion, die genau das tut (eine Methode nach der anderen). Es gibt auch eine "Generate Getters and Setter" -Funktion, die auch den entsprechenden Code in den Funktionskörpern generiert.

    +0

    Danke. Ich suche nach einem Befehlszeilenaufruf, obwohl ... etwas, das ich in einem "Find" -Befehl verwenden kann, um rekursiv ".cpp" -Dateien für alle Headerdateien in meinem Projekt zu generieren. –

    5

    Ich fand mich in letzter Zeit in Ihrer Situation und bemannt, um mein eigenes Werkzeug zu schreiben - impl_me. Es ist ein kleines Ruby-Skript, das SWIG als Parser-Backend verwendet. Es schreibt auf stdout, also können Sie mit Ihrem Lieblingsnix Werkzeugsatz find/grep/sed/awk kombinieren, um für Ihre eigenen Präferenzen zu justieren.

    Da es in Ruby geschrieben ist, sollte es plattformübergreifend sein. SWIG ist auch plattformübergreifend, also sollte alles in Ordnung sein.

    Es ist ziemlich primitiv in diesem Stadium und ist nicht so robust wie Lazy C++ in Bezug auf die Analyse von seltsamen Vorlagen und Materialien. Beiträge sind willkommen :)

    0

    Ich versuchte Lazy C++, aber es scheint nicht mehr aktuell zu sein und nicht mehr gepflegt. Es unterstützt auch nicht den neuesten C++ 14-Standard.

    Deshalb habe ich beschlossen, mein eigenes Werkzeug in Java mit ANTLR4 zu schreiben. Es heißt Score und Sie können es hier finden: https://github.com/underrated/Score

    Im Moment ist es in den Kinderschuhen und könnte voller Bugs sein, aber ich habe vor, es zu verbessern. Probieren Sie es aus, wenn Sie Fehler auf der Github-Seite des Projekts anzeigen möchten. Ich werde versuchen, sie so schnell wie möglich zu beheben.

    +0

    Ich erwarte nicht, dass es im Moment Präprozessor-Bedingungen behandelt, aber ich plane, Unterstützung dafür hinzuzufügen. Darüber hinaus ist das Tool nicht für semantische Prüfungen des Codes vorgesehen. Es identifiziert nur die Methodenimplementierungen und setzt dann die Methodenprototypen in den Header und die Methodenimplementierung in der Quelldatei (plus ein paar mehr "Separationen"). Es liegt an dem Entwickler, die Korrektheit des Codes sicherzustellen (z. B. durch Verwendung einer IDE). Wenn der ursprüngliche Code syntaktische/semantische Fehler aufweist, wird dies auch der generierte sein. Aber sie können entweder von der IDE oder vom Compiler gefunden werden. –

    +0

    @IraBaxter Warum brauchen Sie einen so komplexen Umgang mit Dingen im Zusammenhang mit Michaels Problem? Alles, was er braucht, ist das Kopieren/Einfügen/Modifizieren von Code zu automatisieren. Eine spezielle Behandlung für #ifdefs ist in der Tat notwendig. Vorlagen müssen nicht berührt werden, sie können in der Kopfzeile bleiben. Makroaufrufe werden vom Parser als einfache Identifikatoren oder Funktionsaufrufe angesehen und müssen auch nicht berührt werden. Bei Namespaces können alle "using ..." Anweisungen in der Kopfzeile bleiben. Und der "Namespace ... {...}" kann sowohl in den Header als auch in die Quelldatei kopiert werden. Fehle ich etwas? –

    Verwandte Themen