Konvertieren von C-Quellcode nach C ++

Wie würden Sie vorgehen, um eine relativ große (> 300 KB), ziemlich ausgereifte C-Codebasis in C ++ zu konvertieren?

Die Art von C, an die ich denke, ist in Dateien aufgeteilt, die grob Modulen entsprechen (d. H. Weniger detailliert als eine typische auf OO-Klassen basierende Zerlegung), wobei interne Verknüpfungen anstelle von privaten Funktionen und Daten und externe Verknüpfungen für öffentliche Funktionen und Daten verwendet werden. Globale Variablen werden häufig für die Kommunikation zwischen den Modulen verwendet. Es steht eine sehr umfangreiche Integrationstestsuite zur Verfügung, jedoch keine Tests auf Einheiten- (d. H. Modul-) Ebene.

Ich denke an eine allgemeine Strategie:

Kompilieren Sie alles in der C-Teilmenge von C ++ und bringen Sie es zum Laufen.Konvertieren Sie Module in große Klassen, sodass alle Querverweise auf einen Klassennamen festgelegt sind, wobei jedoch alle Funktionen und Daten als statische Member verbleiben und funktionieren.Konvertieren Sie große Klassen in Instanzen mit geeigneten Konstruktoren und initialisierten Querverweisen. Ersetzen Sie statische Member-Zugriffe durch indirekte Zugriffe. und das zum Laufen bringen.Stellen Sie sich das Projekt nun als eine OO-Anwendung mit schlechten Faktoren vor und schreiben Sie Komponententests, bei denen Abhängigkeiten nachvollziehbar sind, und zerlegen Sie sie in separate Klassen, bei denen dies nicht der Fall ist. Das Ziel hierbei wäre, bei jeder Transformation von einem Arbeitsprogramm zum anderen zu wechseln.

Das wäre natürlich ein ziemlicher Aufwand. Gibt es Fallstudien / Kriegsgeschichten zu dieser Art von Übersetzung? Alternative Strategien? Weitere nützliche Ratschläge?

Hinweis 1: Das Programm ist ein Compiler, und wahrscheinlich verlassen sich Millionen anderer Programme darauf, dass sich sein Verhalten nicht ändert. Daher ist ein umfassendes Umschreiben so gut wie keine Option.

Anmerkung 2: Die Quelle ist fast 20 Jahre alt und hat möglicherweise 30% Codeabwanderung (Zeilen geändert + hinzugefügt / vorherige Gesamtzeilen) pro Jahr. Es ist stark gepflegt und erweitert, mit anderen Worten. Eines der Ziele wäre es daher, die Wartbarkeit zu verbessern.

[Um der Frage willen nehmen wir an, dass die Übersetzung inC ++ ist obligatorisch, und das Belassen in C istnicht eine Option. Der Sinn des Hinzufügens dieser Bedingung besteht darin, die Antworten "in C belassen" auszublenden.]

Antworten auf die Frage(11)

Ihre Antwort auf die Frage