您将如何将相当大(>300K)、相当成熟的 C 代码库转换为 C++?
考虑到的 CI 被拆分为大致对应于模块的文件(即比典型的基于 OO 类的分解更细化),使用内部链接代替私有函数和数据,以及公共函数和数据的外部链接。全局变量广泛用于模块之间的通信。有一个非常广泛的集成测试套件可用,但没有单元(即模块)级别的测试。
我想到了一个总体策略:
- 编译 C++ 的 C 子集中的所有内容并使其正常工作。
- 将模块转换为巨大的类,以便所有交叉引用都由类名限定,但将所有函数和数据保留为静态成员,并使其正常工作。
- 使用适当的构造函数和初始化的交叉引用将大类转换为实例;酌情用间接访问替换静态成员访问;并让它工作。
- 现在,将项目作为一个错误因素的 OO 应用程序来处理,并在依赖项易于处理的情况下编写单元测试,并在它们不易于处理的情况下分解为单独的类;这里的目标是在每次转换时从一个工作程序转移到另一个工作程序。
显然,这将是相当多的工作。有没有关于这种翻译的案例研究/战争故事?替代策略?其他有用的建议?
注 1:该程序是一个编译器,可能有数百万其他程序依赖于它的行为不变,因此大规模重写几乎不是一种选择。
注意 2:源代码已有近 20 年的历史,每年可能有 30% 的代码流失(修改的行数 + 添加的行数/之前的总行数)。换句话说,它被大量维护和扩展。因此,目标之一是提高可维护性。
[为了这个问题,假设翻译成C++是强制性的,并且不能将其留在 C中。添加此条件的目的是清除“将其保留在 C 中”的答案。]