0

私はこのプログラミングの割り当てをCで行っています。しかし、それをどのように編成するかについて混乱しています。

だから、ここに状況があります。私は2つのツリー実装を持っており、それらのstruct / include/functionプロトタイプなどを2つの別々のヘッダーファイルで宣言しています。次に、2つの実装用の2つのcソースコードがあります。ここに問題があります。ツリーのADT用に1つのテストcファイル(テストを実行するための1つのメイン関数のみ)があります。2つの実装は同じテストを使用するためです。同じmain.cファイルの2つのコピーを作成しないようにするにはどうすればよいですか?ツリーimplementation1のヘッダーファイルをインクルードすると、実行できますgcc Tree_implementation1.c main.c。ただし、implementation2を実行するには、メインのソースファイルに戻り、インクルードをツリーimplementation2に手動で変更する必要があります。そうすれば、同じコンパイルコマンドを使用できます。これを回避して、main.cを1つだけ使用して2つの実装を切り替えるにはどうすればよいですか?

4

3 に答える 3

1

コマンドラインで設定できるプリプロセッサと定数を使用します。

あなたのmain.cで:

#ifdef TREE_IMPL1
#include "TreeImplementation1.h"
#else
#include "TreeImplementation2.h"
#endif

// ...

int main(int argc, char **argv)
{
#ifdef TREE_IMPL1
    // code for testing TreeImplementation1
#else
    // code for testing TreeImplementation2
#endif
}

コンパイルするときTREE_IMPL1、コマンド ラインで渡すか省略するか、IDE で設定します。

gcc -DTREE_IMPL1 main.c ...
于 2012-07-31T16:59:35.673 に答える
1

あなたの実装は同じ名前を持っていますか? 彼らはすべきではありません。

それらが同じ名前を持っていない場合 (または同じ場合)、両方のヘッダーを含めて、main.cプリプロセッサ ディレクティブに応じていずれかをテストできます。

//main.c
#include "Tree_implementation1.h"
#include "Tree_implementation2.h"

int main()
{
#ifdef TEST_FIRST
   testFirstTree();  //declared in Tree_implementation1.h
#else
   testSecondTree();  //declared in Tree_implementation2.h
#endif
   return 0;
}
于 2012-07-31T17:00:03.517 に答える
1

問題の別の解決策は、動的インターフェイスを使用することです。そのように働きます:

#include "Imp_1.h"
#include "Imp_2.h"

typedef void (*TreeFunctionType1)(Tree,param);
typedef void (*TreeFunctionType2)(Tree);

typedef struct ITree
{
    TreeFunctionType1 func1;
    TreeFunctionType2 func2;
}ITree;

static ITree _Itree={0};

void SetImp(TreeFunctionType1 f1,TreeFunctionType2 f2)
{
    tree.func1 = f1;
    tree.func2 = f2;
}

/*Use only this functions in your Tests code*/
//{
void Func1(Tree tree,Param param)
{
    (*_Itree.func1)(tree,param);
}

void Func2(Tree tree)
{
    (*_Itree.func2)(tree);
}
//}

int main(int argc, char const *argv[])
{
    SetImp(Imp_1_f1,Imp_1_f2);
    TestCode();
    SetImp(Imp_2_f1,Imp_2_f2);
    TestCode();
    return 0;
}   
于 2012-07-31T19:10:10.763 に答える