Udostępnij za pośrednictwem


Czyszczenie C/C++ w programie Visual Studio

Począwszy od programu Visual Studio 17.8 (wersja zapoznawcza 1), program Visual Studio udostępnia #include funkcję oczyszczania, która poprawia jakość kodu w następujący sposób:

  • Oferuje dodawanie plików nagłówkowych dla kodu kompilowanego tylko dlatego, że wymagany plik nagłówka jest dołączany pośrednio przez inny plik nagłówkowy.
  • Oferuje usuwanie nieużywanych plików nagłówków — skraca czas kompilacji i czystość kodu.

Funkcja Include Cleanup jest domyślnie włączona. Aby dowiedzieć się, jak ją skonfigurować, zobacz Config C/C++ Include Cleanup in Visual Studio (Konfiguracja C/C++ Include Cleanup w programie Visual Studio).

Nagłówki bezpośrednie a pośrednie

Najpierw terminologia:

  • Nagłówek bezpośredni to nagłówek jawnie #include w kodzie.
  • Nagłówek pośredni to nagłówek, którego nie ma jawnie #include. Zamiast tego dołączany jest bezpośrednio plik nagłówkowy. Mówimy również, że nagłówek pośredni jest uwzględniony transitively.

Uwzględnij funkcję Cleanup analizuje kod i określa, które nagłówki nie są używane i które są dołączone pośrednio. Rozważ następujący plik nagłówka:

// myHeader.h

#include <string>
#include <iostream>

void myFunc()
{
    std::string s = "myFunc()\n";
    std::cout << s;
}

Program, który go używa:

// myProgram.cpp
#include "myHeader.h"

int main()
{
    std::string s = "main()"; // string is indirectly included by myHeader.h
    std::cout << s; // cout is indirectly included by myHeader.h
    myFunc();
}

myHeader.h jest nagłówkiem bezpośrednim, ponieważ myProgram.cpp jawnie go zawiera. myHeader.h zawiera <string> i <iostream>, więc są to nagłówki pośrednie.

Problem polega na użyciu myProgram.cpp elementów std::string i std::cout, ale nie zawiera bezpośrednio nagłówków, które je definiują. Ten kod jest kompilowany, ponieważ myHeader.h zawiera te nagłówki. Ten kod jest kruchy, ponieważ jeśli myHeader.h kiedykolwiek przestał zawierać jeden, myProgram.cpp nie będzie już kompilowany.

Zgodnie z wytycznymi języka C++ lepiej jawnie uwzględnić nagłówki dla wszystkich zależności, aby kod nie był przedmiotem kruchości spowodowanej zmianami w plikach nagłówkowych. Aby uzyskać więcej informacji, zobacz C++ Core Guidelines SF.10 (Wytyczne podstawowe języka C++SF.10).

Uwzględnij polecenie Cleanup analizuje kod, aby zidentyfikować nieużywane i pośrednio dołączone nagłówki. Zawiera on opinie na podstawie ustawień opisanych w temacie Konfigurowanie narzędzia #include języka C++ w programie Visual Studio. Opinie mogą być w postaci ostrzeżeń listy błędów, sugestii itp. Aby uzyskać więcej informacji na temat opinii dostarczonych przez narzędzie Include Cleanup, zobacz Dołączanie komunikatów oczyszczania.

Nieużywane nagłówki

W miarę rozwoju kodu niektóre pliki nagłówkowe mogą już nie być potrzebne. Trudno jest śledzić to w złożonym projekcie. Z czasem kompilacje mogą trwać dłużej, ponieważ kompilator przetwarza niepotrzebne pliki nagłówków. Funkcja Include Cleanup ułatwia znajdowanie i usuwanie nieużywanych nagłówków. Na przykład co w przypadku myFunc() komentarza w pliku myProgram.cpp:

// myProgram.cpp
#include "myHeader.h"

int main()
{
    std::string s = "main()"; // string is indirectly included from myHeader.h
    std::cout << s; // cout is indirectly included from myHeader.h
    // myFunc(); // directly included from myHeader.h
}

Na poniższym zrzucie ekranu #include "myHeader.h" jest wygaszona (ustawienie opisane w temacie Konfiguracja narzędzia #include języka C++ w programie Visual Studio), ponieważ nie jest używane, ponieważ myFunc() jest ono oznaczane jako komentarz.

Umieść kursor na wygaszonej #include , aby wyświetlić menu szybkiej akcji. Kliknij żarówkę (lub wybierz link Pokaż potencjalne poprawki ), aby wyświetlić akcje związane z nieużywanym plikiem:

Three refactoring options are shown: Remove # include myHeader.h, remove all unused includes, and Add all transitively used and remove all unused # includes.

Dodawanie przechodnio używanych nagłówków

Możemy usunąć nieużywany plik nagłówka, ale spowoduje to przerwanie kodu, ponieważ <string> i <iostream> są pośrednio uwzględnione za pośrednictwem elementu myheader.h.

Zamiast tego możemy wybrać pozycję Dodaj wszystkie używane przechodnio i usunąć wszystkie nieużywane #includes. Spowoduje to usunięcie nieużywanego nagłówka myHeader.h, ale także dodanie wszelkich używanych nagłówków, które są pośrednio uwzględnione za pośrednictwem elementu myHeader.h. W tym przypadku jest to dodanie #include <string> parametru i #include <iostream> do myProgram.cppelementu i usunięcie #include "myHeader.h"elementu :

// myProgram.cpp
#include <iostream>
#include <string>

int main()
{
    std::string s = "main()"; // string is directly included from <string>
    std::cout << s; // cout is directly included from <string>
    // MyFunc();
}

Narzędzie nie aktualizuje komentarzy, ale widać, że kod jest teraz używany std::string i std::cout bezpośrednio. Ten kod nie jest już kruchy, ponieważ nie zależy od myHeader.h dołączania innych wymaganych nagłówków.

Najlepsze rozwiązanie

Nie usuwaj nieużywanych plików nagłówków bez uprzedniego dodania pośrednio dołączonych plików nagłówków. Dzieje się tak, ponieważ kod może polegać na pośrednich plikach w pliku nagłówkowym, który w przeciwnym razie jest nieużywany. Najpierw dodaj przechodnio używane nagłówki. Następnie po usunięciu nieużywanych nagłówków nie występują błędy kompilacji z powodu brakujących plików nagłówkowych, które są zawarte pośrednio przez usunięty plik nagłówka.

Jednym ze sposobów wykonania tej czynności jest ustawienie Uwzględnij oczyszczanie dla opcji Dodaj brakujące zawiera poziom sugestii na wartość Sugestia (Narzędzia>Opcje>Edytor>tekstu C/C++>Oczyszczanie kodu). Ustaw również pozycję Usuń nieużywane zawiera poziom sugestii na Wartość Sugestia. Następnie:

  1. Na liście błędów upewnij się, że filtr jest ustawiony na build + IntelliSense.
  2. Poszukaj wystąpień "Zawartość z #include x jest używana w tym pliku i dołączana przechodnio".
  3. Umieść kursor nad wierszem z sugestią. Z listy rozwijanej żarówki wybierz pozycję Dodaj wszystkie przechodnio używane elementy dołączane.
  4. Powtórz te kroki w projekcie, dopóki nie zostaną uwzględnione wszystkie sugestie dotyczące przejściowych uwzględnień.
  5. Usuń nieużywane pliki dołączane: na liście błędów wyszukaj wystąpienie "#include x nie jest używane w tym pliku".
  6. Umieść kursor na nieużywanym nagłówku. Z listy rozwijanej żarówki wybierz pozycję Usuń wszystkie nieużywane elementy dołączane.
  7. Powtórz te kroki w projekcie, dopóki nie zostaną uwzględnione wszystkie sugestie dotyczące oczyszczania.

W tym krótkim omówieniu pokazano, jak funkcja Include Cleanup może pomóc w usunięciu nieużywanych nagłówków i dodaniu nagłówków, które zostały uwzględnione pośrednio. Pomaga to zachować czyste kod, potencjalnie szybciej kompilować i zmniejsza kruchość kodu.

Zobacz też

Konfigurowanie oczyszczania dołączania C/C++ w programie Visual Studio
Uwzględnij komunikaty oczyszczania