【问题标题】:Making simple tests in C++用 C++ 做简单的测试
【发布时间】:2013-01-17 19:29:23
【问题描述】:

我需要用 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 文件并定义函数调用。

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

【问题讨论】:

  • .cpp 文件通常不意味着是#included,因此 VS 假设您希望无论main.cpp 的内容如何都单独构建它们。试图撤消它只会让你进一步进入“这很奇怪”的领域。为什么不多花一点时间来了解内置的测试功能,少花一点时间尝试与广泛持有的开发约定作斗争。 :)
  • 但是“main_program.cpp”还在你的项目中吗? (并单独编译?)
  • 好吧,包含一个.cpp 文件是完全合法的,只是这种风格不太好。 include 所做的只是将另一个文件的内容与当前文件连接起来。这不会神奇地“破坏”任何东西,它只是不漂亮而且不容易遵循。 OP 看到的错误可能来自项目中的所有内容并在某个时候编译所有内容(取决于是否定义了宏)然后重建(not clean),因此链接器提取所有定义,这违反了 ODR。

标签: c++ compilation main


【解决方案1】:

VC 将.cpp 文件视为源,应该单独编译,不管它们是否包含在某处。这是通常的行为,您最好不要尝试更改它。

相反,您可以

  • 将您的 .cpp 文件重命名为 .h.inc 并包含头文件
  • 将代码包装在.cpp 中,像这样

    //some_test.cpp
    #ifdef DESIRED_TEST 
    
    //code
    
    #endif
    
    
    //main_program.cpp
    #ifndef DESIRED_TEST 
    
    //code 
    
    #endif
    

    那么你不应该在任何地方包含.cpps。 DESIRED_TEST 可以在通用头文件或项目设置中定义。

  • 但最好的办法是研究 Visual Studio 提供的测试框架并使用它。

【讨论】:

  • 您不需要重命名文件。您可以将其从项目中排除(在解决方案资源管理器中)
  • @qPCR4vir,我相信,从项目中排除文件是个坏主意:你会失去清晰度,例如,你将无法使用项目资源管理器进行导航
  • 是的,你是对的!我说的是一个更简单的想法,而不是更好的想法。无论如何,诸如 IntelliSence、对象浏览器或右键单击包含“指令”以快速打开文件之类的东西仍然可以工作。
【解决方案2】:

但是“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、对象浏览器或右键单击包含“指令”以快速打开文件之类的东西仍然有效

【讨论】:

  • 是的,一切都在项目中。
猜你喜欢
  • 2015-10-03
  • 2021-03-22
  • 2023-03-03
  • 2010-10-17
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2016-12-20
相关资源
最近更新 更多