【问题标题】:How to conditional compile main() in C?如何在 C 中条件编译 main()?
【发布时间】:2015-06-26 08:56:26
【问题描述】:

我正在使用 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 很烦人。

【问题讨论】:

  • 不要包含源文件,而是声明你需要的函数。
  • 有几个称为“minunit”的框架,因此有助于了解哪一个。对于我发现的两个,都没有定义自己的“main()”函数。
  • 考虑使用makecmake
  • @JoachimPileborg 你的意思是把我需要的来自foo.c 的函数声明放在tests.c 的顶部附近吗?
  • @Joe 我没有意识到这一点,我很抱歉。我使用的 minunit 框架是这个:jera.com/techinfo/jtns/jtn002.html

标签: c testing compilation main


【解决方案1】:

使用条件编译最简单的方法是使用#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函数,不要加那个选项。

【讨论】:

  • 我是如此接近!我正要编辑我的帖子说我在foo.c 中有#ifndef TEST_IMPORT #if 0 int main() { return 0; } #endif #endif,但是我没有想到编译标志选项,我现在就试试,非常感谢!
  • 这很好,很好的解决方案。我以后肯定会用这个技巧,非常感谢@wolfPack88!
【解决方案2】:

你没有尝试使用预处理器编译条件吗?可能你试过了,但是没用,哼?

无论如何,你可能应该:

1- 在“tests.c”类文件的顶部定义一个标记,如:

#defined foo_MIN_UNIT_TEST

2- 在“foo.c”类文件中用#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/

问候。

【讨论】:

  • 嘿,感谢您的输入,我确实使用了预处理器指令,但无法使其正常工作。我在对@wolfPack88 的评论中指出了这一点。谢谢您的帮助!我也会记住这一点。
猜你喜欢
  • 2021-02-08
  • 2014-06-03
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2010-12-30
  • 2018-07-13
相关资源
最近更新 更多