1

让我先描述一下情况,然后我会问我的问题。

我有一个非常通用的模块 A。它由一个 c 和一个 h 文件组成。它唯一的依赖是 stdint.h 文件。

还有使用模块 A 的模块 B (#include "module_A.h")。还有另一个模块 C 也使用模块 A。B 和 C 模块都通过 svn:externals 属性对模块 A “托管”具有依赖关系,以确保使用模块 B 或 C 的任何人也已签出模块 A。

模块 B 和 C 彼此无关。在一些项目的开发过程中,碰巧需要模块 B 和 C。已在项目中设置 svn:externals 属性以将这些模块放入项目目录。现在我们在项目目录结构中有这样的东西:

src/module_B/module_B.c
src/module_B/module_B.h
src/module_B/module_A/module_A.c
src/module_B/module_A/module_A.h

src/module_C/module_C.c
src/module_C/module_C.h
src/module_C/module_A/module_A.c
src/module_C/module_A/module_A.h

编译器检测到函数的重复定义并停止编译并出现错误。

我们使用 Eclipse 进行开发。

问题1.如何解决这样的问题?

问题2.如果我们深入研究这个话题,我们可能会想象模块A有多个修订版,模块B和C指向模块A的不同修订版。如何解决这个问题?

4

2 回答 2

0

编译器检测到函数的重复定义并停止编译并出现错误。

这样的错误总是因为编程错误而出现。使用标头保护并且永远不要在 H 文件中分配任何对象。

如果我们深入研究这个话题,我们可能会想象这样一种情况,模块 A 有多个修订版,模块 B 和 C 指向模块 A 的不同修订版。如何解决这个问题?

剧情没有任何意义。有两种情况:

  • 如果它们都依赖于 A 并且只存在于同一个项目中,那么每次更新 A 时都必须更新 B 和 C。

  • 否则,如果它们存在于多个项目中,那么为了使讨论有意义,必须有一个非项目特定的“全局”存储库,您可以在其中存储每个文件的最新版本。即您要在多个项目中重复使用的文件集合。在这个 repo 中,所有文件都应该是最新的。

    假设您更新了 A 和 C,但由于某种原因没有更新 B。那只能意味着 B 是特定于项目的 - 否则您必须与 A 一起更新它。如果它是特定于项目的,那么它不属于“全球”回购,而是在特定于项目的回购中。这样就可以解决所有问题,因为在特定于项目的存储库中,您可以保留旧版本的 A。

于 2013-10-18T06:34:52.133 回答
0

Q1:

如果同一个函数有多个定义,你的链接器会发疯。您需要确保项目中只有 1 个版本的 A:

src/module_A/module_A.c
src/module_A/module_A.h

src/module_B/module_B.c
src/module_B/module_B.h

src/module_C/module_C.c
src/module_C/module_C.h

Q2:

完成这项工作的唯一方法是将 B 和 C 升级为与 A 的相同版本兼容。

您的 A 头文件可能应该包含版本号信息,这将表明版本兼容性:

// Version 1.2    
#define MODULE_A_VER_MAJOR 1 /* For backwards incompatible changes */
#define MODULE_A_VER_MINOR 2 /* For bug fixes */

然后,您可以向模块 B 和 C 添加编译时检查,以确保它们不会被错误的 A 版本意外编译。

#include "module_A.h"
// Require at least 1.1
#if MODULE_A_VER_MAJOR != 1 || MODULE_A_VER_MINOR < 1
    #error Invalid A version!
#endif
于 2013-10-18T06:54:15.790 回答