Преобразование источника C в C ++

Как бы вы пошли о преобразовании достаточно большой (> 300 КБ), достаточно зрелой базы кода C в C ++?

Тип C, который я имею в виду, разбивается на файлы, примерно соответствующие модулям (то есть менее детализированные, чем типичная декомпозиция на основе классов ОО), используя внутреннюю связь вместо частных функций и данных и внешнюю связь для открытых функций и данных. Глобальные переменные широко используются для связи между модулями. Существует очень обширный набор тестов интеграции, но нет тестов уровня юнитов (то есть модулей).

Я имею в виду общую стратегию:

Скомпилируйте все в C ++ подмножество C и получите это работающим.Преобразуйте модули в огромные классы, чтобы все перекрестные ссылки были ограничены именем класса, но все функции и данные оставались бы статическими членами, и это работает.Преобразуйте огромные классы в экземпляры с соответствующими конструкторами и инициализированными перекрестными ссылками; при необходимости замените статический доступ к элементу косвенным доступом; и заставить это работать.Теперь подойдите к проекту как к нецензурному OO-приложению и напишите модульные тесты, в которых можно отслеживать зависимости, и разложите на отдельные классы, где их нет; цель здесь - переходить от одной рабочей программы к другой при каждом преобразовании.

Очевидно, это будет довольно много работы. Существуют ли какие-либо тематические исследования / военные истории о таком переводе? Альтернативные стратегии? Другие полезные советы?

Примечание 1: программа является компилятором, и, вероятно, миллионы других программ полагаются на то, что ее поведение не меняется, поэтому массовое переписывание практически невозможно.

Примечание 2: источнику почти 20 лет, и, возможно, 30% оттока кода (измененные строки + добавленные / предыдущие общие строки) в год. Другими словами, он сильно поддерживается и расширяется. Таким образом, одной из целей будет повышение управляемости.

[Ради вопроса, предположим, что перевод наC ++ является обязательным, и что оставить его в Cне опция. Смысл добавления этого условия состоит в том, чтобы отсеять ответы «оставь это в C».]

Ответы на вопрос(11)

Ваш ответ на вопрос