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