我建议采用以下一般策略:
1.将所有代码编译为 C++ 的 C 子集,并使其正常工作。
2.将模块转换为巨大的类,以便所有交叉引用都由类名范围限定,但保留所有函数和数据作为静态成员,并使其正常工作。
3.将巨大的类转换为具有适当构造函数和初始化交叉引用的实例;根据需要替换静态成员访问为间接访问,并使其正常工作。
4.现在,将项目视为面向对象应用程序,并写出依赖项可跟踪的单元测试,并在依赖项不可跟踪时将其分解为单独的类。在每个转换步骤中,目标都是从一个工作程序移动到另一个工作程序。
该程序是一个编译器,可能有数百万其他程序依赖于其行为不变,因此完全重写基本上不是一种选项。源代码接近20年,每年可能有30%的代码更改,因此其中一个目标是提高可维护性。
请注意:为了问题的简化,假设必须将其转换为C ++,而将其保留在C中不是一个选项。