如何在C中有条件地编译main()?

时间:2015-04-19 18:44:10

标签: c testing compilation main

我正在使用C中的一个小型开源项目,我正在尝试使用带有C的测试框架(框架为min_unit)。

我有一个带有原型的foo.h文件,以及foo.c,带有实现。

在我的测试文件tests.c中,我有

#include "../test_framework/min_unit.h"
#include "foo.c"

... test cases ...

问题是,因为我在main()中有foo.c函数(我需要编译它),我无法编译tests.c,因为我收到一条错误,指出< / p>

note: previous definition of ‘main’ was here
int main() {

我的问题是,有没有办法让main()中的foo.c函数是有条件的,所以当我运行tests.c时它不会编译?只需要一遍又一遍地删除和添加主页就太烦人了。

2 个答案:

答案 0 :(得分:6)

使用条件编译的最简单方法是使用#ifdef语句。例如,在foo.c中你有:

#ifdef NOT_TESTING //if a macro NOT_TESTING was defined
int main() {
    //main function here
}
#endif

test.c中,你放了:

#ifndef NOT_TESTING //if NOT_TESTING was NOT defined
int main() {
    //main function here
}
#endif

如果要编译main中的foo.c函数,只需将选项-DNOT_TESTING添加到编译命令即可。如果要编译main中的test.c函数,请不要添加该选项。

答案 1 :(得分:1)

您是否尝试使用预处理器编译条件?可能是你已经尝试但它不起作用,哼?

无论如何,你可能应该:

1-在&#34; tests.c&#34;顶部定义一个令牌。类文件如:

#defined foo_MIN_UNIT_TEST

2-围绕你的&#34; main(){...}&#34;方法&#34; foo.c&#34;类文件#ifndef / #endif,如:

#ifndef foo_MIN_UNIT_TEST  //consider using #ifndef not #ifdef!!!
int main() 
{ ... }
#endif

3-这样,当您编译单元测试文件时,foo.c的main()方法将不会包含在编译时间内,并且编译器可以使用唯一的main()测试方法。

进一步阅读:http://www.cprogramming.com/

问候。