0

我正在用 C 语言做这个编程作业。但我对如何组织它感到困惑。

所以,情况就是这样。我有两个树实现,并在两个单独的头文件中声明它们的结构/包含/函数原型等。然后我有两个实现的两个 c 源代码。现在问题来了。我有一个用于树 ADT 的测试 c 文件(只有一个用于运行测试的主要功能)。由于这两个实现将使用相同的测试。如何避免制作同一个 main.c 文件的两个副本?当我包含树 implementation1 的头文件时,我可以做gcc Tree_implementation1.c main.c. 但是要执行 implementation2,我必须回到主源文件并手动将 include 更改为 tree implementation2,然后我可以使用相同的编译命令。我如何解决这个问题以仅使用一个 main.c 在两个实现之间切换?

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 回答