【问题标题】:Is it possible to run tests on a cpp file which already has a main function?是否可以对已经具有主要功能的 cpp 文件运行测试?
【发布时间】:2013-07-25 20:38:43
【问题描述】:

在我得到答案之前:“将您要测试的代码移动到另一个 .cpp 文件”我不能这样做。我尝试使用预处理器 #if TESTING_SUITE ... #endif 但这不起作用,我仍然得到:

`main'的多重定义

我像这样编译我的代码:

g++ -lmxml -lccpunit -o pic pic.cpp wmcc.cp test.cpp

我在 pic.cpp 中有一个 main,另一个在 test.cpp 中。有没有办法解决这个问题?

更新

在我的 test.cpp 中:

#define TESTING_SUITE_1

在我的 pic.cpp 中:

#ifndef TESTING_SUITE_1
    int main(...
#endif

不工作

【问题讨论】:

  • 您应该能够将现有的main() 替换为#ifdef。当你尝试它时,你可能做错了什么。你是怎么做到的?
  • 为什么不能将main 移到其他翻译单元?
  • @DavidRodríguez-dribeas 因为我有很多其他的源代码使它复杂化,这只是问题的一小部分。我最初应该这样做,但我现在不能。 BoBTFish 我更新了我的 Q
  • 代码大小无所谓,只需要提取到不同的翻译单元一个函数即可:main
  • 我有很多其他文件、库和链接,我的意思是其他源代码。我不能简单地移动它而不破坏一切。糟糕的设计,但我需要在发布固定版本以移植主版本之前进行修复。

标签: c++ unit-testing testing c-preprocessor


【解决方案1】:

您可以为链接器指定另一个入口点。 对于代码中的 MS cl.exe:(对不起,我没有看到你使用 gcc)

#pragma comment(linker, "/entry:alternative_main")

或通过项目属性页:

Configuration Properties >
  Linker >
    Advanced >
      Entry Point

或直接在命令行:

/entry:alternative_main

对于 gcc,它是以下命令行开关:

-Wl,-ealternative_main

其他编译器请参考手册。

【讨论】:

  • 我得到:main 的多个定义。在手册页中找不到那个版本?
  • -Wl,optionoption 传递给链接器(我假设)。 -e-entry 的快捷方式,并指定链接器应使用的入口点。这些选项是非常标准的并且已经实施,因为......我不知道,很长一段时间:p
  • 哦,我现在明白了。我没有将 test.cpp 中的 main 更改为 alternative_main,因为我不明白 - 但经过您的解释,这很清楚。谢谢。
【解决方案2】:

你可以通过编译来做到这一点

g++ -Dmain=main_pic_moved -c pic.cpp
g++ -Dmain=main_wmcc_moved -c wmcc.cp
g++ -lmxml -lccpunit -o pic pic.o wmcc.o test.cpp

【讨论】:

  • 我得到:`main_pic_moved(int, char**) 的多个定义。调查 -Dmain 虽然。
  • 有那些确切的行吗?我看不出这是怎么发生的。
猜你喜欢
  • 2022-01-09
  • 2019-01-11
  • 2014-08-08
  • 2013-02-08
  • 2014-06-03
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多