Korzystam z Enterprise VS 2015 i przeprowadziłem test jednostki ogólnej, aby przeanalizować zasięg kodu. Patrzę na listę objętych bloków na funkcję i ogólnie wydają się poprawne. Jednak po kliknięciu prawym przyciskiem myszy metody -> "Przejdź do kodu źródłowego", w niektórych funkcjach przechodzi do poprawnego miejsca w kodzie źródłowym (odpowiedni plik .cpp), ale na innych próbuje otworzyć plik nagłówkowy (numer wiersza źródłowego jest poprawny, ale kod znajduje się w pliku .cpp, a nie w pliku .h). Wpływa to na podświetlanie kodu źródłowego - funkcje, które według VS są w .h, nie są podświetlone w .cpp. Nie mogę określić żadnej różnicy w funkcjach (ta sama widoczność, te same pliki nagłówkowe i źródłowe), z wyjątkiem może tego, do którego wątku są wywoływane. Każdy pomysł, dlaczego VS myśli, że jakiś kod jest w .h zamiast .cpp?Ochrona kodu Visual Studio 2015 Zły plik
Odpowiedz
Wygląda na to, że nawet jeśli VS 2015 obsługuje funkcję C++ 11 non-static data member initializers (poprawnie się kompiluje), dławiki narzędzia rozszerzającego działają na tę funkcję. Oto MCVE. Używam aktualizacji VS 14.0.24720.00 1. Aby odtworzyć, skompiluj ten program, a następnie uzyskaj pokrycie kodu, uruchamiając go przy użyciu Generic Test. Jeśli zainicjowano x
, narzędzie do wykrywania szuka kodu konstruktora w pliku .h. Jeśli usuniesz = 0
, poprawnie identyfikuje definicję konstruktora tak, jak w .cpp. W moim kodzie produktu nie był to konstruktor, lecz pozornie losowe funkcje, które narzędzie pokrycia uważało za zdefiniowane w pliku .h. Poprawka, w moim przypadku, polegała na przeniesieniu inicjalizacji elementu danych na listę inicjalizacji konstruktora.
//.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;
}
[mcve] może pomóc. Czy korzystasz z szablonów? – AndyG
Zgadzam się. Brak funkcji szablonowych. – Jeff
Czy projekt x64 lub x86? Pamiętam, że są problemy z x64. – AndyG