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

How to conditional compile main() in C?

我正在用 C 开发一个小型开源项目,我正在尝试使用 C 的测试框架(该框架是 min_unit)。

我有一个包含原型的 foo.h 文件和包含实现的 foo.c 文件。

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

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

... test cases ...

问题是,因为我在 foo.c 中有一个 main() 函数(我需要编译它),我无法编译 tests.c 因为我得到一个错误州

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

我的问题是,有没有办法让 foo.c 中的 main() 函数是有条件的,这样当我 运行 tests.c?不得不一遍又一遍地删除和添加 main 真烦人。

使用条件编译最简单的方法是使用#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

当你想在foo.c中编译main函数时,你只需在你的编译命令中添加选项-DNOT_TESTING。如果要在test.c中编译main函数,请不要添加该选项。

你没有试过使用预处理器编译条件吗?可能是您已经尝试过但它不起作用,嗯?

无论如何,你可能应该:

1- 在 "tests.c" class 文件顶部定义一个标记,例如:

#defined foo_MIN_UNIT_TEST

2- 在 "foo.c" class 文件中用 #ifndef / #endif 包围你的 "main() { ... } " 方法,例如:

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

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

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

此致。