打算在项目中试试 CATCH 这个测试框架。请同事在工程中进行了试验,结果却出现了一点问题。

CATCH 和 GTest 之类的框架一样,可以直接在 C++ 文件中定义测试函数,就能自动地注册到测试列表中,而不需要显式地“注册”测试函数这样的代码。其实原理很简单,就是定义一个宏(TEST_CASE),这个宏展开以后,会定义一个全局对象,测试函数作为构造函数的参数传入,然后构造函数中做相应的“注册”动作。由于全局变量的构造函数会在Main函数执行之前就执行,所以就可以在 Main 被执行前,把所有的测试函数注册到测试列表中。

CATCH 这个框架用起来非常简单,只需要包含一个 catch.hpp 头文件就可以了。这也是我看中这个框架的原因。虽然说应该是很简单的,但我还是先新建了一个工程进行了测试,在这个工程中,有三个文件,其中一个包含 main 函数,另外两个就是单纯地定义测试函数。一切都非常顺利,两个 test case 都被执行了,而且结果也正确。

  1. #include "catch.hpp"
  2. extern unsigned int Factorial(unsigned int number);
  3. TEST_CASE("Factorials are computed 2", "[factorial]") {
  4.     REQUIRE(Factorial(1) == 1);
  5.     REQUIRE(Factorial(2) == 2);
  6.     REQUIRE(Factorial(3) == 6);
  7.     REQUIRE(Factorial(10) == 3628800);
  8. }

我的想法是“main函数”定义在一个文件中,其它文件只要愉快地写 TestCase 就可以了,这样分工起来也容易,合并的工作量也极小。

不过当同事在我们正式的开发工程中做同样类似的事的时候,却出问题。他定义在单独文件中的的 Test case 函数总是不能执行。这下我傻眼了。

我把他的工程拷到我的机器上运行,结果也是一样的。有点头疼。后来我注意到一点,当我把断点打在新加的 TEST_CASE 函数中,运行起来以后,这个断点会显示“此断点无法命中”这样的信息。我只好猜测,虽然我每次修改这个文件VS都会重新编译工程,并且也能看到生成的对应的 obj 文件,但这个文件很有可能没有被链接到工程中。因为我们的正式的开发工程比较大,文件很多,可能是因为 VS 在编译大的工程时,自作聪明做了优化,把认为“从来没有用到过的文件”不进行链接。为什么 VS 会认为新增加的 TestCase 文件没有被使用过呢?因为 CATCH 框架(我觉得GTest等也是一样的)的注册方式是隐性的,它定义的全局变量的构造函数中把自己另一个函数关联到整个的 TestCase 表中,然后再在 Main 函数中通过这张 TestCase 函数表来调用所有的测试函数。VS 很可能在这里分析错误,误以为这些函数不会被用到。如果我在这个文件中随便定义一个函数,然后再在其它会执行的函数中调用这个函数,那么 VS 就不会做这个优化了。于是我这么试了一下,TEST_CASE 文件就被执行了。

(优化不是这么容易做的啊~谁把它报给 VS 吧~)

VS的工程链接优化的问题的更多相关文章

  1. dede内链怎么优化,Dedecms内部链接优化技巧

    dede内链怎么优化,dedecms内部链接优化技巧 使用dedecms的过程中发现,可以通过dedecms的文档关键词维护功能.发表文章时候的关键词添加功能(也可以自动获取)以及核心设置里面的是否使 ...

  2. 痞子衡嵌入式:MCUXpresso IDE下工程链接文件配置管理与自动生成机制

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下工程链接文件配置管理与自动生成机制. 痞子衡在 2018 年初写过一个专题 <嵌入式开发文件系列&g ...

  3. vs工程链接出现error LNK2005...already defined

    今天使用vs2008编译工程无错误,链接过程,出现很多这样的错误: error LNK2005: "public: __thiscall std::basic_string<char, ...

  4. VuePress 博客之 SEO 优化(三)标题、链接优化

    前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ...

  5. express工程的优化和请求参数的处理

    1.让工程自动刷新 在Express的默认工程中,ejs, jade等模板的改变会立刻被渲染到浏览器中,但是js的改变不能立即刷新.这时候我们要用到一些自动刷新工具, 如 nodemon, super ...

  6. Listview 异步加载图片之优化篇(有图有码有解释)

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有b ...

  7. WordPress SEO ☞ WordPress网站终极优化指南

    原文地址:http://www.eastdesign.net/wordpress-seo/ 最新消息,东方设计学院 WordPress SEO 系列视频教程正在持续更新中,目前为了不至于让视频传播过于 ...

  8. 骑士周游问题跳马问题C#实现(附带WPF工程代码)

    骑士周游问题,也叫跳马问题. 问题描述: 将马随机放在国际象棋的8×8棋盘的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码要求: 1,可以任意选定马在棋盘上 ...

  9. [转]优化Flash性能

    原文:http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html 翻译:http://bbs.9ria.c ...

随机推荐

  1. [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序

    11.2 Write a method to sort an array of strings so that all the anagrams are next to each other. 这道题 ...

  2. linux实践——简单程序破解

    一.运行login可执行程序,屏幕显示需要输入密码,随便输入一串字符,结果是Drop dead! 二.objdump -d login,对login进行反汇编,找到main函数,找到含有scanf的那 ...

  3. 20145233韩昊辰 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)

    20145233 <Java程序设计>实验报告一:Java开发环境的熟悉 实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Java程序. 实验内容 ...

  4. sql server 数据库备份,完整备份,差异备份,自动备份说明

    Sql server 设置完整备份,差异备份说明 在数据库管理器中,选择要备份的数据库,右键找到“备份” 然后可以按照备份的方式进行备份. 关于文件的还原,作以下补充说明: 步骤为: 1.在需要还原的 ...

  5. [poj3666]Making the Grade(DP/左偏树)

    题目大意:给你一个序列a[1....n],让你求一个序列b[1....n],满足 bi =a && bc,则最小的调整可以是把b变成c. 所以归纳可知上面结论成立. dp[i][j] ...

  6. Bootstrap3.0学习第十九轮(JavaScript插件——标签页)

    详情请看 http://aehyok.com/Blog/Detail/46.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  7. NABCD模型进行竞争性需求分析

    确定项目:教室管理系统 负责人:李凤娇,高德建 选择比努力更重要.一个项目成功自然离不开组员们的努力.但是,光努力是不够的.还需要用户有需求,能快速实现. 这些东西,看似很虚,却能让我们少走不少弯路. ...

  8. final和static

    /*    final修饰符  1. final修饰的类不能被继承,没有子类  2. final修饰的方法不能被子类覆盖  3. final修饰的变量表示常量,只能被赋值一次  4. final 修饰 ...

  9. 【HDU 2222】Keywords Search AC自动机模板题

    参考iwtwiioi的模板写出来的.上午gty讲的并没有听懂,只好自己慢慢对着模板理解. 在HDU上为什么相同的程序提交有时T有时A!!! 奉上sth神犇的模板(不是这道题): var ch:char ...

  10. Hibernate-二级缓存策略

    二级缓存的策略 当多个并发的事务同时访问持久化层的缓存中的相同数据时,会引起并发问题,必须采用必要的事务隔离措施. 在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题.因此可以设定以下4种类型的 ...