我需要在C ++中进行一些简单的测试(以前从未做过)。我在visual studio 2010工作,我遇到了内置测试选项卡。但我真的不喜欢它,而且对我来说似乎过于复杂。
所有我需要的是一个自定义的main()方法,所以我可以启动快速控制台应用程序,看看类是否按预期执行。
我决定通过创建一个包装器启动器文件来解决这个问题,这个文件将成为程序的主要起点。
所以,我的main.cpp文件包含:
#define DESIRED_TEST "some_test.cpp"
#ifndef DESIRED_TEST
#include "main_program.cpp"
#else
#include DESIRED_TEST
#endif
main_program.cpp是运行整个程序的文件(它有main方法)。 如您所见,如果我定义DESIRED_TEST并分配一个包含文件,则不包括main_program.cpp,并且只应构建测试文件(其中也包含main方法)。 但是,在编译时我得到了这个输出:
1>main.obj : error LNK2005: _main already defined in some_test.obj
1>main_program.obj : error LNK2005: _main already defined in some_test.obj
1>C:\....... : fatal error LNK1169: one or more multiply defined symbols found
我应该如何告诉编译器程序中的主要起点是main.cpp,它应该只根据该文件进行编译和链接,忽略所有其他目标文件中的多个定义?
以下是我克服此问题的方法(main.cpp文件):
#define DESIRED_TEST "some_test.h"
#ifndef DESIRED_TEST
int main(int argc, char *argv[])
{
// main program code here
}
#else
#include DESIRED_TEST
int main() {
FUNCTION_CALL();
}
#endif
some_test.h文件:
void some_test();
#define FUNCTION_CALL some_test
现在我需要的是每次测试都创建新的some_test.h和some_test.cpp文件并定义函数调用。
我不想在视觉工作室学习测试标准的原因是因为我的关卡项目的测试非常简单。我可能需要在将来学习它,但是当事情变得非常复杂时,我会学习它。
答案 0 :(得分:3)
VC将.cpp
文件视为源,应该单独编译,不管事实如何,它们都包含在某处。这是通常的行为,你最好不要试图改变它。
相反,你可以
.cpp
个文件重命名为.h
或.inc
并改为包含头文件将代码包含在.cpp
内,如
//some_test.cpp
#ifdef DESIRED_TEST
//code
#endif
//main_program.cpp
#ifndef DESIRED_TEST
//code
#endif
然后你不应该在任何地方加入.cpp
。
DESIRED_TEST
可以在公共标题或项目设置中定义。
但最好的方法是学习Visual Studio提供的测试框架并使用它。
答案 1 :(得分:0)
但是“main_program.cpp”仍在您的项目中? (并单独编译?)
你在main.cpp :( main.cpp在项目中)
#define DESIRED_TEST "some_test.cpp"
#ifndef DESIRED_TEST
#include "main_program.cpp"
#else
#include DESIRED_TEST
#endif
现在,简单地从项目中排除some_test.cpp和main_program.cpp(在解决方案资源管理器中),但不要删除文件!像IntelliSence,对象浏览器或右键单击包含“指令”以快速打开文件仍然可以工作