【问题标题】:Supporting more than one codebase in ANSI-C在 ANSI-C 中支持多个代码库
【发布时间】:2011-07-10 04:30:50
【问题描述】:

我正在开发一个项目,它有一个相关的 Ansi-C 代码库。 (让我称之为“主要”代码库)。

我现在面临一个典型问题(如下所述),我相信如果我手头有一种面向对象的语言,我将能够轻松解决这个问题。

问题是这样的: 我将不得不启动多个代码库;即我将不得不开始支持并行代码库(将来甚至可能更多)。所有新(即并行)代码库的初始代码库最初将与旧(即“主”)代码库相同。

当我们谈论“C”语言时,我一直在考虑将“#ifdef”语句添加到代码中,并在这些“ifdef”块中编写分支空间代码。

希望我把问题说清楚了(够了!),我想听听关于聪明的模式的想法,这些模式可以帮助我在 Ansi C 中优雅地处理这个问题

干杯

【问题讨论】:

  • 我不明白为什么使用面向对象的语言会更容易。正如乔纳森所说,这里最重要的是明确区分功能,以便有一个很好的方法来跟踪差异。具有不同分支的大型 C 项目的一个很好的例子是 linux 内核。它使用 git 进行分布式版本控制。

标签: c design-patterns conditional-compilation multiple-projects


【解决方案1】:

不同的代码库之间会发生什么变化?

  • 如果只是不同的平台,请仔细隔离平台依赖关系,尽可能多地在所有平台上保持核心代码相同,并将特定于平台的内容放入单独的文件中。

  • 如果您要从根本上更改程序功能,您需要弄清楚如何在允许程序之间存在差异的同时保持未更改代码的共同核心。

请注意,在这两种情况下,首要的问题是了解将要更改的内容,并设置代码以使更改尽可能少。通常,处理变体的最佳方法(不可避免地会有变体;否则,拥有两个或多个版本没有意义)是将不同的变体放在单独的文件中,然后编译和链接正确的文件。不过,有时将变体(或变体的一部分)放在一个文件中并使用#ifdef 样式条件编译会更好。

另一个关键点是将所有内容保持在同一个版本控制系统下 - 尽可能长,或者比这长一两年。

我见过的最大灾难发生在不同版本停止使用通用代码库时。现在我们需要重新整合这两个代码库,十年的分离开发是一个主要障碍。过去 15 年的综合发展有起有落,但与我们现在面临的问题相比,没有任何意义。啊!

【讨论】:

    【解决方案2】:

    您可以抽象出差异(或至少尝试)。将所有特定于代码库的代码放在与程序逻辑分开的文件中。然后,您可以使用条件编译(ifdef-include)并且只需要为每个新代码库替换代码库特定文件,而您的整个应用程序逻辑可以保持不变。

    【讨论】:

      【解决方案3】:

      作为基于#ifdef 的解决方案的替代或补充,您可以在SCM 中维护不同的分支。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        • 2011-12-14
        相关资源
        最近更新 更多