打算在项目中试试 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. 4.HBase In Action 第一章-HBase简介(1.1.2 数据创新)

    As we now know, many prominent internet companies, most notably Google, Amazon, Yahoo!, and Facebook ...

  2. 数据库防火墙如何防范SQL注入行为

    SQL注入是当前针对数据库安全进行外部攻击的一种常见手段.现有主流应用大多基于B/S架构开发,SQL注入的攻击方式正是利用web层和通讯层的缺陷对数据库进行外部恶意攻击.将SQL命令巧妙的插入通讯的交 ...

  3. Xamarin.Form 实例: Discuz BBS 客户端 源码分享

    感谢台风, 这个十一长假让我好好的休息了一回, 睡觉到腰酸背疼, 看电影看到眼发红. 今天最后一天, 不敢出去逛, 不知道哪会还会下暴雨... 嗯嗯..这个项目其实在十一之前就开始了, 工作无聊,没有 ...

  4. #Linux学习笔记# Linux文件的所有者、群组和其他人

    1.关于所有者.群组和其他人 在Linux系统中,每个文件都具有User.Group和Others三种身份的权限配置.那这三种身份分别表示什么意思呢?配置这三种身份的权限有啥意义呢? (1)文件所有者 ...

  5. Object C学习笔记21-typedef用法

    在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...

  6. 模态窗口插件之Jbox

    $.jBox.tip("报损数量不能大于库存数!", 'error'); $.jBox.tip("请选择要报损的产品", "warn"); ...

  7. 在线富文本编辑器FckEditor配置(.Net Framework 3.5)

    进入FCKeditor文件夹,编辑 fckconfig.js 文件.1.上传设置  .  var _FileBrowserLanguage         = 'php' ;         // a ...

  8. [wikioi 1519]过路费(最小生成树+树链剖分)

    题目:http://www.wikioi.com/problem/1519/ 题意:给你一个连通的无向图,每条边都有权值,给你若干个询问(x,y),要输出从x到y的路径上边的最大值的最小值 分析:首先 ...

  9. 【Groovy基础系列】 Groovy运算符

    ?运算符 在java中,有时候为了避免出现空指针异常,我们通常需要这样的技巧: if(rs!=null){ rs.next() … … } 在groovy中,可以使用?操作符达到同样的目的: rs?. ...

  10. 【POJ 3320】Jessica's Reading Problemc(尺取法)

    题 题意 P个数,求最短的一段包含P个数里所有出现过的数的区间. 分析 尺取法,边读边记录每个数出现次数num[d[i]],和不同数字个数n个. 尺取时,l和r 代表区间两边,每次r++时,d[r]即 ...