c++ - 我想告诉 VC++ 编译器编译所有代码。可以吗?

标签 c++ compiler-construction visual-studio-2005 code-coverage

我正在为非托管 C++ 使用 VS2005 VC++。我有 VSTS,正在尝试使用代码覆盖工具来完成与单元测试有关的两件事:

  1. 查看我引用的测试代码中有多少被执行了
  2. 查看我的被测代码中有多少方法(如果有的话)根本没有经过单元测试

设置 VSTS 代码覆盖工具(请参阅 link text)并完成任务 #1 非常简单。然而,#2 对我来说是一个令人惊讶的挑战。这是我的测试代码。

class CodeCoverageTarget
{
public:
    std::string ThisMethodRuns() {
         return "Running";
    }

    std::string ThisMethodDoesNotRun() {
        return "Not Running";
    }
};



#include <iostream>
#include "CodeCoverageTarget.h"
using namespace std;
int main()

{
    CodeCoverageTarget cct; 
    cout<<cct.ThisMethodRuns()<<endl;
}

如上所示,当两个方法都在类中定义时,编译器会自动从 obj 文件中删除 ThisMethodDoesNotRun()。如果我将它的定义移到类之外,那么它就会包含在 obj 文件中,并且代码覆盖工具显示它根本没有被执行过。在大多数情况下,我希望编译器为我做这个消除,但对于代码覆盖工具来说,它会破坏很大一部分值(value)(例如,找到未经测试的方法)。我已经尝试了很多方法来告诉编译器停止对我聪明并编译所有内容,但我很难过。如果代码覆盖工具对此进行了补偿(我想通过扫描源并将其与链接器输出匹配),那就太好了,但我没有发现任何迹象表明它有一个特殊的模式要打开。我是不是完全遗漏了一些简单的东西,或者这对 VC++ 编译器 + VSTS 代码覆盖工具来说是不可能的?

提前致谢, 克格勃

最佳答案

您可以尝试添加一行代码,仅在某些条件为真时调用该函数,并保证该条件永远不会为真。只要确保编译器无法解决这个问题。例如,


int main(int argc, char **argv)
{
  if(argv == NULL)  // C runtime says this won't happen
    someMethodWhichIsntReallyEverCalled();
}

关于c++ - 我想告诉 VC++ 编译器编译所有代码。可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/104952/

相关文章:

c++ - C++ 类模板的显式实例化是否实例化依赖的基类?

c++ - 为什么 system() 提示 cwd 未知?

c++ - friend 在 C++ 中遇到麻烦

c++ - 编写我自己的 C++ 编译器 .. 卡在变量上

c++ - boost::array 不在 VS 2005 上编译

c - 在 VC 6 中构建源代码时出错

visual-studio - 如何使visual studio输出窗口可编辑

c++ - 不止一个重载函数实例

windows - 尝试在 Windows 上编译时出错

c++ - 对函数 AST 声明的抽象格式的混淆