1

最初に状況を説明させてください。それから質問に答えます。

非常に一般的なモジュール A があります。これは、1 つの c ファイルと 1 つの h ファイルで構成されています。唯一の依存関係は stdint.h ファイルです。

モジュールAを使ったモジュールBもあります(#include "module_A.h")。モジュール A を使用する別のモジュール C もあります。モジュール B と C の両方のモジュールは、モジュール B または C を使用する人がモジュール A もチェックアウトしていることを確認するために、svn:externals プロパティを介してモジュール 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 の異なるリビジョンを指している状況を想像するかもしれません。このような問題を解決するにはどうすればよいでしょうか?

シナリオに意味はありません。次の 2 つのケースがあります。

  • 両方が A に依存し、同じプロジェクトにのみ存在する場合、A が更新されるたびに B と C を更新する必要があります。

  • それ以外の場合、それらが複数のプロジェクトに存在する場合、この議論が意味をなすためには、プロジェクト固有ではない「グローバル」リポジトリが必要であり、そこにすべてのファイルの最新バージョンが保存されます。つまり、複数のプロジェクトで再利用されるファイルのコレクションです。このレポでは、すべてのファイルが最新である必要があります。

    A と C を更新するが、何らかの理由で B を更新しないとします。これは、B がプロジェクト固有であることを意味するだけです。それ以外の場合は、A と一緒に更新する必要があります。プロジェクト固有の場合、B には属しません。 「グローバル」レポではなく、プロジェクト固有のレポです。プロジェクト固有のリポジ​​トリでは、古いバージョンの A を保持できるため、これですべてが整理されます。

于 2013-10-18T06:34:52.133 に答える
0

Q1:

同じ関数の定義が複数あると、リンカーが狂ってしまいます。プロジェクトに A のバージョンが 1 つしかないことを確認する必要があります。

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 に答える