2013-01-17 36 views
1

我需要在C++中进行一些简单的测试(从未做过)。我在Visual Studio 2010中工作,我遇到了内置的测试选项卡。但我真的不喜欢它,看起来过于复杂。在C++中进行简单的测试

我需要的只是一个自定义的main()方法,所以我可以启动快速控制台应用程序,并查看类是否应该执行。

我决定通过创建一个包装启动文件来解决这个问题,它将成为程序的主要起点。

所以,我的main.cpp文件包含:

#define DESIRED_TEST "some_test.cpp" 

#ifndef DESIRED_TEST 
#include "main_program.cpp" 
#else 
#include DESIRED_TEST 
#endif 

main_program.cpp是运行于整个程序(它的主要方法),则它的文件。 正如你所看到的,如果我定义了DESIRED_TEST并分配了一个包含文件,main_program.cpp就不包含在内,并且只有测试文件应该被构建(其中也包含主要方法)。 然而,当涉及到编制,我得到这样的输出:

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中,它应该编译和链接仅根据该文件,忽略所有其他目标文件中有多个定义?


这里是我是如何克服这个问题(在ma​​in.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文件并定义函数调用。

我不想在Visual Studio中学习测试standart的原因是因为我的关卡项目测试非常简单。我将来可能需要学习它,但是当事情变得非常复杂时,我会学习它。

+0

'.cpp'文件通常不是'#inc''d,所以VS假设你不管main.cpp的内容如何,​​都希望它们分开构建。试图撤消这一切只会让你进一步陷入“这是奇怪的”领域。为什么不花更多的时间去了解内置的测试功能,以及少一点时间试图对抗广泛持有的开发惯例。 :) –

+0

但是“main_program.cpp”仍然在您的项目中? (并单独编译?) – qPCR4vir

+1

那么,包含'.cpp'文件是完全合法的,它只是不好的风格。什么包括只是连接另一个文件的内容与当前文件。这不会神奇地“打破”任何东西,它只是不漂亮,不容易遵循。 OP看到的错误可能来自项目中的所有内容,并且在某个时刻编译所有内容(取决于宏是否已定义),然后重新构建(_not clean_),因此链接器将获取所有定义,即违反了ODR。 – Damon

回答

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提供的测试框架并使用它。

+0

你不需要重命名文件。您可以将其从项目中排除(在解决方案资源管理器中) – qPCR4vir

+0

@ qPCR4vir,我相信,从项目中排除文件是一个坏主意:您将失去清晰度,您将无法使用项目资源管理器进行导航,例如 – Lol4t0

+0

是的,你是对的!我说了一个更简单的主意,而不是更好的主意。无论如何,诸如IntelliSence,Object Browser之类的东西,或右键单击包含“指令”以快速打开文件仍然可行。 – qPCR4vir

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,对象浏览器,或右键单击包含“指令”来快速打开文件仍然可以运行

+0

是的,一切都在项目内。 –

+0

这个新的解决方案可能很简单... – qPCR4vir