it-swarm.com.de

Wie man C ++ Code in C konvertiert

Ich habe etwas C++ Code. Im Code sind viele Klassen definiert, deren Member-Funktionen, Konstruktoren, Destruktoren für diese Klassen, einige Template-Klassen und viele C++ - Dinge. Jetzt muss ich den Quellcode in einfachen C-Code konvertieren.

Ich habe folgende Fragen:

  1. Gibt es ein Tool zum Konvertieren von C++ - Code und Header-Dateien in C-Code?

  2. Muss ich den Code komplett umschreiben (ich muss die Konstruktoren und Destruktoren entfernen und diesen Code in einige init(), deinit() Funktionen verschieben; Klassen in Strukturen ändern, existent machen)? Elementfunktionen als Funktionszeiger in diesen neu definierten Strukturen und dann mit Funktionszeigern usw. aufrufen.)?

  3. Auf welche C++ - spezifischen Codedatenkonstrukte/-semantiken muss ich bei der Konvertierung von C++ nach C achten, wenn ich sie manuell konvertieren muss?

46
goldenmean

Es gibt in der Tat ein solches Tool, den C++ - Compiler von Comeau. . Es wird C-Code generiert, den Sie nicht manuell pflegen können, aber das ist kein Problem. Sie behalten den C++ - Code bei und wandeln ihn im Handumdrehen in C um.

32
MSalters

http://llvm.org/docs/FAQ.html#translatecxx

PS: Ich habe es überhaupt nicht benutzt. Lass mich wissen ob es funktioniert.

16
plan9assembler

Während Sie in C OO tun können (z. B. durch Hinzufügen eines theType *this erster parameter für methoden und manuelle handhabung von so etwas wie vtables für polymorphismus) dies ist als design nie besonders zufriedenstellend und wird hässlich aussehen (selbst bei einigen hacks mit vorprozessoren).

Ich würde vorschlagen, zumindest ein Re-Design zu betrachten, um zu vergleichen, wie dies funktionieren würde.

Insgesamt hängt viel von der Antwort auf die Schlüsselfrage ab: Wenn Sie mit C++ arbeiten, warum möchten Sie stattdessen C?

6
Richard

Vielleicht reicht die gute alte Front ?

5
niutech

Ein Compiler besteht aus zwei Hauptblöcken: dem 'Front-End' und dem 'Back-End'. Das Front-End eines Compilers analysiert den Quellcode und erstellt eine Art "Zwischendarstellung" des Quellcodes, die mit einem Maschinenalgorithmus viel einfacher zu analysieren ist als der Quellcode (dh, für den der Quellcode, z. B. C++, entworfen wurde) hilf dem menschlichen Programmierer, Code zu schreiben, das Zwischenformular soll helfen, den Algorithmus zu vereinfachen, der das Zwischenformular leichter analysiert). Das Backend eines Compilers nimmt die Zwischenform an und konvertiert sie dann in eine 'Zielsprache'.

Nun, die Zielsprache für Compiler für allgemeine Zwecke sind Assemblersprachen für verschiedene Prozessoren, aber es gibt nichts, was ein Compiler-Back-End daran hindert, Code in einer anderen Sprache zu produzieren, solange diese Zielsprache (mindestens) so flexibel ist wie a allgemeiner CPU Assembler.

Nun, wie Sie sich wahrscheinlich vorstellen können, ist C definitiv so flexibel wie der Assembler einer CPU, so dass ein C++ - zu-C-Compiler aus technischer Sicht wirklich kein Problem darstellt.

Sie haben also: C++ --- frontEnd ---> someIntermediaryForm --- backEnd ---> C

Vielleicht möchten Sie diese Typen ausprobieren: http://www.edg.com/index.php?location=c_frontend (Der obige Link ist nur informativ für was can getan werden, lizenzieren sie ihre Frontends für Zehntausende von Dollar)

PS Soweit ich weiß, gibt es keinen solchen C++ zu C-Compiler von GNU, und das schlägt mich total (wenn ich recht habe). Da die C-Sprache ziemlich klein ist und die internen Mechanismen recht rudimentär sind, erfordert ein C-Compiler so etwas wie ein Mannjahr Arbeit (ich kann Ihnen aus erster Hand sagen, weil ich selbst vor Jahren einen solchen Compiler geschrieben habe, und es erzeugt eine [ Virtual] Stack Machine Intermediary Code), und in der Lage zu sein, einen gepflegten, aktuellen C++ - Compiler zu haben, während man einen C-Compiler nur einmal schreiben muss, wäre eine großartige Sache ...

4
Gyll

Dies ist ein alter Thread, aber anscheinend der C++ Faq hat einen Abschnitt(Archivierte Version 2013) zu diesem Thema. Dies wird anscheinend aktualisiert, wenn der Autor kontaktiert wird, so dass dies auf lange Sicht wahrscheinlich aktueller sein wird, aber hier ist die aktuelle Version:

Kommt darauf an, was du meinst. Wenn Sie meinen, ist es möglich, C++ in lesbaren und wartbaren C-Code zu konvertieren? In diesem Fall lautet die Antwort "Nein". C++ - Funktionen werden nicht direkt auf C abgebildet, und der generierte C-Code ist nicht für den Menschen vorgesehen. Wenn Sie stattdessen meinen, gibt es Compiler, die C++ in C konvertieren, um auf eine Plattform zu kompilieren, die noch keinen C++ - Compiler hat? dann haben Sie Glück - lesen Sie weiter.

Ein Compiler, der C++ mit C kompiliert, führt eine vollständige Syntax- und Semantikprüfung für das Programm durch und verwendet zufällig C-Code zum Generieren von Objektcode. Ein solcher Compiler ist nicht nur eine Art ausgefallener Makroprozessor. (Und schreiben Sie mir bitte keine E-Mail, wenn Sie behaupten, dies seien Präprozessoren - das sind sie nicht - es handelt sich um vollständige Compiler.) Es ist möglich, alle Funktionen des ISO-Standards C++ durch Übersetzung in C zu implementieren in Objektcode mit einer Effizienz, die mit der eines herkömmlichen C++ - Compilers vergleichbar ist.

Hier sind einige Produkte, die die Kompilierung nach C durchführen:

  • Comeau Computing bietet einen Compiler an, der auf Front-End der Edison Design Group basiert und C-Code ausgibt.
  • LLVM ist ein herunterladbarer Compiler, der C-Code ausgibt. Siehe auch hier und hier . Hier ist ein Beispiel für die Konvertierung von C++ in C über LLVM .
  • Cfront , die ursprüngliche Implementierung von C++, die von Bjarne Stroustrup und anderen bei ATT durchgeführt wurde, generiert C-Code. Es gibt jedoch zwei Probleme: Es ist schwierig, eine Lizenz zu erhalten, seit Mitte der 90er Jahre, als es durch ein Labyrinth von Besitzerwechseln ging und die Entwicklung zur gleichen Zeit eingestellt wurde und es daher keine Fehlerbehebungen und keine Unterstützung mehr gibt der neueren Sprachfunktionen (z. B. Ausnahmen, Namespaces, RTTI, Member-Vorlagen).

  • Im Gegensatz zum populären Mythos gibt es zum jetzigen Zeitpunkt keine Version von g ++, die C++ in C übersetzt. So etwas scheint machbar zu sein, aber ich bin mir nicht bewusst, dass es (noch) niemand wirklich getan hat.

Beachten Sie, dass Sie normalerweise die CPU, das Betriebssystem und den C-Compiler der Zielplattform angeben müssen, damit der generierte C-Code speziell für diese Plattform bestimmt ist. Dies bedeutet: (a) Sie können den für Plattform X generierten C-Code wahrscheinlich nicht auf Plattform Y kompilieren; und (b) es wird schwierig sein, die Übersetzung selbst zu machen - mit einem dieser Tools wird es wahrscheinlich viel billiger/sicherer.

Noch einmal: Schreiben Sie mir keine E-Mails mit dem Hinweis, dass dies nur Präprozessoren sind - sie sind es nicht - sie sind Compiler.

2
Shafik Yaghmour