Convertir la fuente de C a C ++

¿Cómo haría para convertir una base de código C bastante madura (> 300K) y bastante madura a C ++?

El tipo de C que tengo en mente se divide en archivos que corresponden aproximadamente a módulos (es decir, menos granular que una descomposición basada en clases de OO típica), utilizando enlaces internos en lugar de funciones y datos privados, y enlaces externos para funciones y datos públicos. Las variables globales se utilizan ampliamente para la comunicación entre los módulos. Existe un conjunto de pruebas de integración muy extenso disponible, pero no hay pruebas de nivel de unidad (es decir, módulo).

Tengo en mente una estrategia general:

Compile todo en el subconjunto C de C ++ y haga que funcione.Convierta los módulos en clases grandes, de modo que todas las referencias cruzadas tengan el alcance de un nombre de clase, pero dejen todas las funciones y datos como miembros estáticos y hagan que funcionen.Convierta clases enormes en instancias con constructores apropiados y referencias cruzadas inicializadas; reemplazar los accesos de miembros estáticos con accesos indirectos según sea apropiado; y haz que funcione.Ahora, enfóquese en el proyecto como una aplicación OO de factor erróneo y escriba pruebas unitarias donde las dependencias sean manejables, y descomponga en clases separadas donde no lo sean; El objetivo aquí sería pasar de un programa de trabajo a otro en cada transformación.

Obviamente, esto sería un poco de trabajo. ¿Hay estudios de caso / historias de guerra sobre este tipo de traducción? ¿Estrategias alternativas? ¿Otros consejos útiles?

Nota 1: el programa es un compilador, y probablemente millones de otros programas confían en que su comportamiento no cambie, por lo que la reescritura al por mayor no es una opción.

Nota 2: la fuente tiene casi 20 años de antigüedad y tiene quizás un 30% de abandono de código (líneas modificadas + líneas totales agregadas / anteriores) por año. Es muy mantenido y extendido, en otras palabras. Por lo tanto, uno de los objetivos sería aumentar la capacidad de mantenimiento.

[Por el bien de la pregunta, asuma que la traducción alC ++ Es obligatorio, y que dejarlo en C sea.no una opción. El punto de agregar esta condición es eliminar las respuestas "dejarlo en C".]

Respuestas a la pregunta(11)

Su respuesta a la pregunta