我该如何组织这个C项目

时间:2012-07-31 16:57:17

标签: c

我在C中进行这个编程任务。但我对如何组织它感到困惑。

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

3 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}