mikrocontroller.net

Forum: PC-Programmierung Library um C++-Code automatisch zu manipulieren


Autor: T. H. (therrmann)
Datum:

Bewertung
-10 lesenswert
nicht lesenswert
Hallo Leute,
ich arbeite zum Teil mit etwas komplexen C++-Klassen, wo es schon 
einiges an Arbeit darstellt, ein leeres Grundgerüst für eine neue Klasse 
zu erstellen, das nur die benötigten Methoden der Parentklasse (leer) 
implementiert.

Normalerweise kopiere ich dann manuell .h- und .cpp einer halbwegs 
passenden ähnlichen Klasse, benenne alle Vorkommen des Klassennamens um, 
lösche manuell alle nicht benötigten Methoden und leere bei den anderen 
Methoden den body.

Das ganze müsste sich doch gut automatisieren lassen, so dass die 
Ausgangs .cpp- und .h von einer Library geparst werden und man 
anschließend sagt "kopiere Klasse X, nenne sie um in Klasse Y, behalte 
Methoden a,b,c, lösche deren Body und lösche alle anderen Methoden".

Gibt es eine Library für so etwas?

Mir ist klar, dass die meisten IDEs diese Schritte anbieten, aber das 
sind halt doch etliche Mausklicks, und ich würde stattdessen lieber 
schnell ein Shellskript aufrufen.

Danke
Herrmann

Autor: Murkser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: T. H. (therrmann)
Datum:

Bewertung
-11 lesenswert
nicht lesenswert
Bevor ich das Problem damit löse, kann ich mich auch 1 Woche hinsetzen 
und einen C++-Parser und -Processor in Antlr schreiben. Ich suche ein 
einfach zu bedienenes Tool, das keine Woche Einarbeitung kostet, sondern 
mit einem Tutorial zeigt, wie man z.B. Methoden-Bodies entfernt oder 
dergleichen.

Herrmann

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
5 lesenswert
nicht lesenswert
Ich verstehe, was Du machen willst, allerdings kann ich mir nicht 
vorstellen, dass das irgendwie sinnvoll ist. So etwas löst man mit 
templates, nicht mit externen Tools.

Autor: T. H. (therrmann)
Datum:

Bewertung
-13 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Ich verstehe, was Du machen willst,

Das wage ich zu bezweifeln.

> allerdings kann ich mir nicht
> vorstellen, dass das irgendwie sinnvoll ist.

Ich glaube, niemand hatte gefragt, was du dir vorstellen kannst.

> So etwas löst man mit
> templates, nicht mit externen Tools.

Im Prinzip geht es darum, diese Templates aus vorhandenem Code zu 
erstellen, weil die Templateerstellung bei großen Dateien einiges an 
Arbeit macht.
Und nein, Templateerstellung löst man nicht mit Templates.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
5 lesenswert
nicht lesenswert
T. H. schrieb:
> Wilhelm M. schrieb:
>> Ich verstehe, was Du machen willst,
>
> Das wage ich zu bezweifeln.

Ich dachte, Du wolltest Hilfe haben ...

>> allerdings kann ich mir nicht
>> vorstellen, dass das irgendwie sinnvoll ist.
>
> Ich glaube, niemand hatte gefragt, was du dir vorstellen kannst.

Schlecht aufgewacht heute?

>> So etwas löst man mit
>> templates, nicht mit externen Tools.
>
> Im Prinzip geht es darum, diese Templates aus vorhandenem Code zu
> erstellen, weil die Templateerstellung bei großen Dateien einiges an
> Arbeit macht.
> Und nein, Templateerstellung löst man nicht mit Templates.

Du sprachst von Klassen, nicht von templates, nur um das mal klar zu 
stellen...

Viel Spaß weiterhin.

Autor: T. H. (therrmann)
Datum:

Bewertung
-9 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Du sprachst von Klassen, nicht von templates, nur um das mal klar zu
> stellen...

Vielleicht definierst du erstmal, was du unter Templates verstehst. 
C++-Templates helfen hier nämlich überhaupt nicht. Templates im Sinne 
einer Klasse, die noch ihrer Methodenbodies beraubt ist, und die 
vielleicht noch über Klassennamen etc. parametrisiert werden können, 
sind im Prinzip das, was ich brauche, wobei ich den Template-Schritt 
eigentlich überspringen will, weil ich regelmäßig neue Klassen aus 
anderen vorhandenen Klassen modifizieren muss.

Ich werde nun aber nicht weiter auf dich eingehen, denn du willst nur 
Recht behalten und keine Fragen beantworten.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
6 lesenswert
nicht lesenswert
T. H. schrieb:
> Wilhelm M. schrieb:
>> Du sprachst von Klassen, nicht von templates, nur um das mal klar zu
>> stellen...
>
> Vielleicht definierst du erstmal, was du unter Templates verstehst.

Das brauche ich auch nicht, denn das ist im Kontext von C++ wohl 
definiert.

> Ich werde nun aber nicht weiter auf dich eingehen, denn du willst nur
> Recht behalten und keine Fragen beantworten.

Auch in Ordnung.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
5 lesenswert
nicht lesenswert
T. H. schrieb:
> Mir ist klar, dass die meisten IDEs diese Schritte anbieten, aber das
> sind halt doch etliche Mausklicks,

Wieviel hundert Klassen pro Stunde musst du denn anlegen?

Ich würde mir für den Fall eine „leere“ Klasse schreiben, die dann 
jedesmal ins Projekt kopieren, und per refactoring-rename der IDE 
umbenennen.

Oder aber mal grundlegend über die Softwarearchitektur nachdenken, ob’s 
da nicht vielleicht doch ein paar grundlegend Optimierungsmöglichkeiten 
gibt, damit der ganze Blödsinn gar nicht erst erforderlich wird.

Oliver

Beitrag #5453063 wurde von einem Moderator gelöscht.
Autor: Kai S. (zigzeg)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Schau Dir mal libclang an. Eventuell auch clangMR.

- ZigZeg

Autor: T. H. (therrmann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kai S. schrieb:
> Schau Dir mal libclang an. Eventuell auch clangMR.

Danke, das sieht sehr gut aus!

Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
T. H. schrieb:
> Bevor ich das Problem damit löse, kann ich mich auch 1 Woche hinsetzen
> und einen C++-Parser und -Processor in Antlr schreiben.

Äh, ne. Das haben sich schon andere Leute gedacht und die sind alle 
gescheitert. Deshalb steigen sogar die IDEs jetzt alle auf LLVM/clang 
um. Und ja, ich denke auch, wenn du ernsthaft sowas machen willst ist 
vermutlich LLVM die richtige generelle Richtung, auch wenn ich keine 
Ahnung habe ob und wie gut das AST-Manipulation kann.

Evtl. kann auch ein Perlskript die beste Lösung sein; gut möglich, dass 
die tatsächlich korrekte Lösung so komplex ist dass es sich nicht lohnt.

: Bearbeitet durch User
Autor: Duck Mc Scrooge (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
>Hallo Leute,
>ich arbeite zum Teil mit etwas komplexen C++-Klassen, wo es schon
>einiges an Arbeit darstellt, ein leeres Grundgerüst für eine neue Klasse
>zu erstellen, das nur die benötigten Methoden der Parentklasse (leer)
>implementiert.

>Normalerweise kopiere ich dann manuell .h- und .cpp einer halbwegs
>passenden ähnlichen Klasse, benenne alle Vorkommen des Klassennamens um,
>lösche manuell alle nicht benötigten Methoden und leere bei den anderen
>Methoden den body.


Für mich klingt es danach, dass es eine Menge an Klassen gibt, die 
jeweils Funtionalitäten breitstellen, welche nach Bedarf in anderen 
Klassen enthalten sein sollen?
Das reinkopieren und löschen klingt für mich nach nicht sinnvoll 
angewendetem Vererben.

Was hat es mit der genannten Parentklasse auf sich?


Insgesamt - wenn man anfängt per Hand "möglichst ähnliche" Klassen zu 
kopieren und dann zu editieren, stimmt etwas mit der Architektur nicht.

Dann ist mir der Ausdruck "leeres Grundgerüst" aufgefallen. Ich denke es 
kann Sinn machen in Design Patterns zu stöbern. Z.B. gibt es sowas wie 
"structural Pattern". Man darf die aber nicht zuuuu broternst nehmen, 
manchmal / meist muss man die Beispiele ein bisschen auf den eigenen 
Anwendungsfall "tweaken".

Autor: Ich (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Welche IDE benutzt du denn?
Der QtCreator macht das alles sehr bequem.

Autor: Der Andere (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Duck Mc Scrooge schrieb:
> Insgesamt - wenn man anfängt per Hand "möglichst ähnliche" Klassen zu
> kopieren und dann zu editieren, stimmt etwas mit der Architektur nicht.

Korrekt

Autor: Wühlhase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mit einer Frage mal vom Thema abschweifen darf:
Kennt C++ denn nicht so etwas wie abstrakte Klassen oder abstrakte 
Funktionen in Java?

Die Problemstellung:
T. H. schrieb:
> ich arbeite zum Teil mit etwas komplexen C++-Klassen, wo es schon
> einiges an Arbeit darstellt, ein leeres Grundgerüst für eine neue Klasse
> zu erstellen, das nur die benötigten Methoden der Parentklasse (leer)
> implementiert.
ist doch wie gemacht dafür. Und alle abstrakten Methoden zu 
implementieren dauert in Netbeans exakt zwei Mausklicks (Erst die 
Warnung und dann den Lösungsvorschlag anklicken und die leeren 
Methodenbodies sind drin) und ich glaub nicht, das andere IDEs da 
unnötig viel mehr Arbeit reinstecken.
Von daher wundere ich mich doch über soviel Handarbeit.

Autor: Ich (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Wühlhase schrieb:
> Kennt C++ denn nicht so etwas wie abstrakte Klassen oder abstrakte
> Funktionen in Java?

Doch natürlich.
Wenn man aber mit MS Notepad arbeitet, hat man dennoch viel Tipparbeit.

Autor: T. H. (therrmann)
Datum:

Bewertung
-7 lesenswert
nicht lesenswert
Leute, Kai hat mein Problem mit seinem Hinweis auf libclang gelöst. Ihr 
braucht nicht weiter mit eurem Kindergartensoftwarearchitekturwissen 
prahlen.

Dass man nicht noch mal komplett von null anfängt, wenn mal auf einem 
riesigen Open-Source Projekt aufbaut, das seit 25 Jahren gewachsen ist 
und daher nicht optimal vom heutigen Stand des Softwaredesigns gesehen, 
könnt ihr euch in eurer kleinen Welt offenbar nicht vorstellen.

Ich muss mit dem arbeiten, was ich habe. Alles von vorne und nochmal 
richtig machen könnt ihr gerne in eurem Kindergarten, dann seid ihr im 
Erwachsenenalter vielleicht da, wo ich jetzt bin. Wenn ihr euch gerne 
reden hört, macht weiter so und gebt euren Senf auf den großen Haufen, 
der hier schon abgeladen wurde. Ich bin raus.

Autor: Duck Mc Scrooge (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dass man nicht noch mal komplett von null anfängt, wenn mal auf einem
>riesigen Open-Source Projekt aufbaut, das seit 25 Jahren gewachsen ist
>und daher nicht optimal vom heutigen Stand des Softwaredesigns gesehen,
>könnt ihr euch in eurer kleinen Welt offenbar nicht vorstellen.


Nein, dass sind Voraussetzungen, von denen du am Anfang nichts gesagt 
hast.

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wäre es doch mal spannend zu wissen, in welchem 25 Jahre alten 
C++-OSS Projekt auch heute noch so viele Klasse pro Tag hinzugefügt 
werden müssen, als dass man dafür ein Tool schreibt ...

Autor: Carl D. (jcw2)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Duck Mc Scrooge schrieb:
>>Dass man nicht noch mal komplett von null anfängt, wenn mal auf einem
>>riesigen Open-Source Projekt aufbaut, das seit 25 Jahren gewachsen ist
>>und daher nicht optimal vom heutigen Stand des Softwaredesigns gesehen,
>>könnt ihr euch in eurer kleinen Welt offenbar nicht vorstellen.
>
>
> Nein, dass sind Voraussetzungen, von denen du am Anfang nichts gesagt
> hast.

Jemand von seiner Qualifikation hätte eine solche Frage hier gar nicht 
stellen müssen, oder?

Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Carl D. schrieb:
> Duck Mc Scrooge schrieb:
>>>Dass man nicht noch mal komplett von null anfängt, wenn mal auf einem
>>>riesigen Open-Source Projekt aufbaut, das seit 25 Jahren gewachsen ist
>>>und daher nicht optimal vom heutigen Stand des Softwaredesigns gesehen,
>>>könnt ihr euch in eurer kleinen Welt offenbar nicht vorstellen.
>>
>>
>> Nein, dass sind Voraussetzungen, von denen du am Anfang nichts gesagt
>> hast.
>
> Jemand von seiner Qualifikation hätte eine solche Frage hier gar nicht
> stellen müssen, oder?

Hatte ich mir eben verkniffen zu sagen: ist der Held und kennt 
libclang/etc. nicht ;-)

Autor: Bert3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf ich den Troll füttern, Mama? Jetzt mal ehrlich dein Ton ist völlig 
unangebracht, keine Ahnung warum du seit der 1. Antwort um dich 
schlägst? Würdest du genau so auch in einem Bewerbungsgespräch auftreten 
wenn dir die Antworten nicht gefallen - ich denke eher nicht, also warum 
dann hier? Klar gibt es einen haufen Vollanfänger im Internet - aber das 
wissen wir doch schon lange und chillen trotzdem

>Leute, Kai hat mein Problem mit seinem Hinweis auf libclang gelöst.

brauchst du wirklich einen vollwertigen Parser/AST/Code-Generator für 
deine Lösung - hätte nicht auch eine Beschreibungsdatei/pseudo IDL nebst 
kleinem Codegenerator gereicht - deine Frage gibt solche Details aber 
leider nicht her, wie soll man da adäquat antworten

>Dass man nicht noch mal komplett von null anfängt, wenn mal auf einem
>riesigen Open-Source Projekt aufbaut, das seit 25 Jahren gewachsen ist
>und daher nicht optimal vom heutigen Stand des Softwaredesigns gesehen,
>könnt ihr euch in eurer kleinen Welt offenbar nicht vorstellen.

Das ist doch völliger Standard - du lässt es so klingen als wäre das was 
ganz besonderes - wenn du mal x Projekte durch hast (in verschiedenen 
Firmen) wirst du verstehen wie komisch es ist über die "komplexität" des 
Projektes an dem man arbeitet zu sprechen - immer subjektiv, niemand hat 
die Chance es nach zu voll ziehen = völlig sinnfrei

>Ich muss mit dem arbeiten, was ich habe.

Hat ja auch keiner was anderes gefordert

>Alles von vorne und nochmal
>richtig machen könnt ihr gerne in eurem Kindergarten, dann seid ihr im
>Erwachsenenalter vielleicht da, wo ich jetzt bin.

Den Satz lass ich mir auf ein T-Shirt drucken, ist der von dir?

>Wenn ihr euch gerne reden hört, macht weiter so und gebt
>euren Senf auf den großen Haufen, der hier schon abgeladen wurde.

hier kommunizieren Leute aller Klassen von Hello-world-geht-nicht bis 
haupt-maintainer-des-gccs, aus deiner 1. Frage kann man dazu nichts 
ableiten

>Ich bin raus.
und schon kann fällt dein Blutdruck wieder auf normal Niveau

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.