我想告诉VC&x2B+;编译器编译所有代码。能做到吗? 我使用VS2005 VC++进行非托管C++。我有VST,我正在尝试使用代码覆盖工具来完成与单元测试有关的两件事: 查看有多少被测试的引用代码正在被执行 看看有多少被测试代码的方法(如果有的话)根本没有经过单元测试

我想告诉VC&x2B+;编译器编译所有代码。能做到吗? 我使用VS2005 VC++进行非托管C++。我有VST,我正在尝试使用代码覆盖工具来完成与单元测试有关的两件事: 查看有多少被测试的引用代码正在被执行 看看有多少被测试代码的方法(如果有的话)根本没有经过单元测试,c++,compiler-construction,visual-studio-2005,code-coverage,C++,Compiler Construction,Visual Studio 2005,Code Coverage,设置VSTS代码覆盖工具(请参阅)并完成任务#1非常简单。然而#2对我来说是一个令人惊讶的挑战。这是我的测试代码 class CodeCoverageTarget { public: std::string ThisMethodRuns() { return "Running"; } std::string ThisMethodDoesNotRun() { return "Not Running"; } }; #inclu

设置VSTS代码覆盖工具(请参阅)并完成任务#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;
}
class CodeCoverageTarget
{
公众:
std::string ThisMethodRuns(){
返回“运行”;
}
std::string ThisMethodDoesNotRun(){
返回“未运行”;
}
};
#包括
#包括“CodeCoverageTarget.h”
使用名称空间std;
int main()
{
编码过目标cct;

关闭函数的内联。最简单的方法是在调试模式下编译


编辑:看到您的说明后,我发现我的答案有误。如果您使用“内联”将函数体移动到.h文件的另一个部分中,可能会关键字?

很抱歉,我应该澄清一下,我正在构建调试模式,并关闭内联和所有优化。此外,代码在内联发生之前就被删除了,因为它从未被引用过,甚至没有被考虑用于内联。

您可以尝试添加一行代码,仅当某些条件为真时才调用函数,并且请确保该条件永远不会为真。只需确保编译器无法理解。例如


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

另一个选项是根据您的构建,使用.inl文件在内联函数和非内联函数之间切换,如下所示:

在foo.inl文件中:

inline std::string Foo::ThisMethodDoesNotRun()
{
    return "Not Running";
}
在foo.h中:

#if !COVERAGE_BUILD
#include "foo.inl"
#endif
在foo.cpp中:

#if COVERAGE_BUILD
#define inline
#include "foo.inl"
#endif

确保函数不被丢弃的一种方法是导出它们。可以通过向函数声明中添加来实现这一点。最好将其包装在C预处理器宏中,以便可以将其关闭,因为它是特定于编译器的,并且您可能不希望所有生成都导出符号。导出函数的另一种方法是创建。

如果内联是一个问题,那么您也可以成功地使用它


您的代码是否在静态库中,然后编译为测试EXE/DLL?链接器将自动丢弃静态库中未引用的对象文件。例如:如果静态库包含
a.obj
b.obj
以及将其链接到
b.obj
中引用符号的EXE/DLL,但不包含t
a.obj
,则
a.obj
的内容将不会链接到可执行文件或DLL。但是,在重新阅读您的描述后,这里的情况听起来不像是这样。

谢谢,我们有很多遗留代码,因此尝试改装将是一个问题。Kevin我试图解决的问题是检测func已经编写并在单元测试中被完全遗忘的函数/函数。这应该可以工作,但如果我记得这样做,我可能还记得对函数进行单元测试。谢谢!KevinI在这里问了一个相关但更一般的问题: