我正在使用VS 2015 Enterprise,我运行了一个通用的单元测试来分析代码覆盖率。我正在查看每个函数的覆盖块列表,它们通常看起来是正确的。但是,当我右键单击一个方法时 - > "转到源代码",在某些函数上它转到源代码中的正确位置(相关的.cpp文件),但在其他函数上它尝试打开头文件(源行号是正确的) ,但代码在.cpp文件中 - 而不是.h文件。这会影响源代码突出显示 - 在.cpp中没有突出显示VS认为的功能.h。我无法确定功能的任何差异(相同的可见性,相同的头文件和源文件),除了他们要调用的线程。知道为什么VS认为某些代码是.h而不是.cpp?
答案 0 :(得分:0)
显然,尽管VS 2015支持C ++ 11功能non-static data member initializers(它确实可以正确编译),但覆盖工具会阻塞此功能。这是MCVE。我正在使用VS 14.0.24720.00更新1.要重现,请编译此程序,然后使用Generic Test运行代码覆盖。如果初始化x
,则coverage工具会在.h文件中查找构造函数的代码。如果你取出= 0
,它会正确识别.cpp中的构造函数定义。在我的产品代码中,它不是构造函数,但是覆盖工具认为在.h文件中定义的看似随机的函数。在我的例子中,修复只是将数据成员初始化移动到构造函数初始化列表。
//.h
class Test
{
public:
Test();
~Test();
void Func1();
void Func2();
void Func3();
int x = 0;
};
// .cpp
#include "Test.h"
#include <iostream>
Test::Test()
{
std::cout << "in Test()" << std::endl;
}
Test::~Test()
{
}
void Test::Func1()
{
std::cout << "in Func1" << std::endl;
Func2();
Func3();
}
void Test::Func2()
{
std::cout << "in Func2" << std::endl;
}
void Test::Func3()
{
std::cout << "in Func3" << std::endl;
}