main()有条件地编译会产生冲突

时间:2014-04-19 11:32:46

标签: c makefile configure autoconf automake

项目目录/lib/mytest.c中的一个文件包含用于测试目的的条件主

#ifdef TEST 
int main(int argc, char *argv[])
#endif

所以要测试我在configure.ac文件中添加的代码

AC_DEFINE(TEST, 1,[My description for TEST])

还有其他文件包含mytest.h。当我尝试autoreconf然后./configure然后让我在gcc中得到以下错误:

multiple definition of `main'

这是可以理解的,因为包含mytest.h的文件中也包含主要功能。我希望有一个独立的mytest程序用于测试目的。

如何构建项目?我需要在配置nad Make文件中做出哪些更改?

感谢。

1 个答案:

答案 0 :(得分:0)

一般情况下,跟踪ifdef以定义main以允许tesrt驱动程序是繁琐的,并且您已经注意到,容易出错。

您可以像评论一样,在您的其他#ifndef TEST个文件中添加.c,并使用相同的文件来定义TEST。但是,如果你有第三个或更多的测试驱动程序,该怎么办呢。

我采用的解决方案更简单,总是有一个main,但是让它调用其他不称为main的main函数,例如可以调用常规main函数{{1}你的测试可能是main_program,小方测试可能是main_test1。为了保持意图清晰,我通常在所有这些psudo-main函数前加上main_test_tiny_func

我偶尔会使用注释来切换我想要使用的伪主体,但这会变得很乱。

的main.c

main_

或者,您可以设置清单常量,以决定在有多个测试的情况下运行哪个测试

int main(int argc, char *argv[])
{
#ifdef TEST1
     return main_test1(argc, argv);
#else
#ifdef TINY_TEST 
     return main_test_tiny_func(argc, argv);
#else
     return main_program(argc, argv);
#endif
#endif
}

在运行时决定运行哪些(例如回归测试)偶尔会很有用,在这种情况下,您将使用与上面相同的开关并吃第一个arg来决定

#ifndef TEST_TO_RUN
#define TEST_TO_RUN 0
#endif

int main(int argc, char *argv[])
{
     switch(TEST_TO_RUN)
     case 2:
          return main_test1(argc, argv);
     case 1:
          return main_test_tiny_func(argc, argv);
     case 0:
          return main_program(argc, argv);
     }
}