boost库相关C++编译器内建函数打桩问题 — intrinsic 函数

大部分函数都包含在库中,但有一部分函数内建于编译器中,这就是内建函数(Intrinsic Function)。
C++内建函数是一种编译器特殊函数,它的行为类似与C++的内联函数,但是由于它是编译器提供的,所以编译器对其更加了解更利于优化。 比如说memcpy等就是内在函数。如果编译器有选择/Optimization,那么编译器在生成代码的时候将直接插入运行代码而不是调用该函数,这和内联函数差不多,但是如上所说,由于编译器对其的了解,这个优化会更好。
关于内在函数的详细信息参见微软文档:https://msdn.microsoft.com/en-us/library/26td21ds.aspx
 
在C++编程中使用boost库时,有时会用到C++内建函数,例如_interlockedbittestandset。_interlockedbittestandset 是设置系统同步原子访问的内在函数 ,包含在 intrin.h 头文件中。 原子操作是CPU执行指令的最小单元,是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,在执行完毕之前不会被任何其它任务或事件中断。
在进行单元测试时,由于C++test不能识别这类编译器固有的内在函数,会自动对这类函数进行打桩,执行单元测试,报出error C2169: '_interlockedbittestandset' : intrinsic function, cannot be defined。这是因为编译器内在函数无法进行重新定义。对于这种内在函数是不能也没有必要进行打桩的。解决这类问题,我们可以手动移除相关的桩函数,也可以右键项目属性>>C++test>>其他设置>>高级选项,添加如下内容:
edgtk.intrinsicRoutine _interlockedbittestandset
即可正常进行测试。
 
参考资料:
posted @ 2016-07-27 12:02  如是耳闻  阅读(1077)  评论(0编辑  收藏  举报