Sdílet prostřednictvím


Vyčištění C/C++ zahrnuje v sadě Visual Studio

Počínaje verzí Visual Studio 17.8 Preview 1 poskytuje #include Visual Studio funkci čištění, která zlepšuje kvalitu kódu následujícími způsoby:

  • Nabízí přidání souborů hlaviček pro kód, který se zkompiluje pouze proto, že potřebný hlavičkový soubor je nepřímo zahrnut jiným hlavičkovým souborem.
  • Nabízí odebrání nepoužívaných souborů hlaviček, což zlepšuje časy sestavení a čistotu kódu.

Zahrnout vyčištění je ve výchozím nastavení zapnuté. Informace o tom, jak ho nakonfigurovat, najdete v tématu Konfigurace C/C++ Include Cleanup v sadě Visual Studio.

Přímá vs. nepřímá záhlaví

Nejprve několik terminologie:

  • Přímá hlavička je hlavička, kterou explicitně #include v kódu používáte.
  • Nepřímá hlavička je hlavička, kterou explicitně #includenepoužíváte . Místo toho obsahuje soubor záhlaví, který přímo zahrnete. Říkáme také, že je zahrnuta transitivelynepřímá hlavička .

Zahrnout Vyčištění analyzuje váš kód a určuje, které hlavičky se nepoužívají a které jsou nepřímo zahrnuté. Podívejte se na následující hlavičkový soubor:

// myHeader.h

#include <string>
#include <iostream>

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

A program, který ho používá:

// 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 je přímá hlavička, protože myProgram.cpp ji explicitně obsahuje. myHeader.h obsahuje <string> a <iostream>, takže se jedná o nepřímé hlavičky.

Problém spočívá v tom, že myProgram.cpp se používá std::string , std::coutale neobsahuje přímo hlavičky, které je definují. Tento kód se zkompiluje, protože myHeader.h obsahuje tyto hlavičky. Tento kód je křehký, protože pokud myHeader.h by se někdy zastavil zahrnutí jednoho z nich, myProgram.cpp už by se nezkompiloval.

Podle pokynů jazyka C++ je lepší explicitně zahrnout hlavičky pro všechny závislosti, aby kód nebyl vystavený brittleness způsobený změnami souborů hlaviček. Další informace najdete v tématu C++ Core Guidelines SF.10.

Zahrňte čištění, které analyzuje váš kód, aby identifikoval nepoužívané a nepřímo zahrnuté hlavičky. Poskytuje zpětnou vazbu na základě nastavení popsaných v nástroji C++ #include v sadě Visual Studio. Zpětná vazba může být ve formě upozornění, návrhů atd. Další podrobnosti o zpětné vazbě poskytnuté zahrnutím vyčištění najdete v tématu Zahrnout zprávy vyčištění.

Nepoužité hlavičky

S vývojem kódu už možná nebudete potřebovat nějaké hlavičkové soubory. V komplexním projektu se to těžko sleduje. Sestavení v průběhu času můžou trvat déle, protože kompilátor zpracovává nepotřebné soubory hlaviček. Zahrnutí vyčištění vám pomůže najít a odebrat nepoužívané hlavičky. Co když myFunc() je například okomentován v 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 následujícím snímku obrazovky #include "myHeader.h" je neaktivní (nastavení popsané v nástroji C++ #include v sadě Visual Studio), protože se nepoužívá, protože myFunc() je zakomentováno.

Když najedete myší na neaktivní, #include zobrazí se nabídka rychlých akcí. Kliknutím na žárovku (nebo zvolte odkaz Zobrazit potenciální opravy ) zobrazíte akce související s nepoužívaným souborem:

Zobrazí se tři možnosti refaktoringu: Remove # include myHeader.h, remove all unused includes, and Add all transitively used and remove all unused # includes.

Přidání tranzitivních použitých hlaviček

Mohli bychom se rozhodnout odebrat nepoužívaný soubor hlavičky, ale tím se přeruší kód, protože <string> a <iostream> nepřímo jsou zahrnuty prostřednictvím myheader.h.

Místo toho můžeme zvolit Možnost Přidat všechny tranzitivní použití a odebrat všechny nepoužívané #includes. Tím se odebere nepoužívaná hlavička myHeader.h, ale přidá se také všechna použitá záhlaví, která jsou nepřímo zahrnuta prostřednictvím myHeader.h. Výsledkem je v tomto případě přidávání a odebírání #include <string> myProgram.cpp#include "myHeader.h":#include <iostream>

// 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();
}

Nástroj neaktualizuje komentáře, ale vidíte, že kód teď používá std::string a std::cout přímo používá. Tento kód už není brittle, protože není závislý na myHeader.h zahrnutí dalších požadovaných hlaviček.

Osvědčený postup

Neodebíjejte, co se zdá být nepoužívané soubory hlaviček, aniž byste napřed přidali nepřímo zahrnuté hlavičkové soubory. Je to proto, že váš kód může spoléhat na nepřímé zahrnutí do souboru hlaviček, který se jinak nepoužívá. Nejprve přidejte přechodně použité hlavičky. Když pak odeberete nepoužívané hlavičky, nezískáte chyby kompilace kvůli chybějícím souborům hlaviček, které jsou nepřímo zahrnuté souborem hlaviček, který jste odebrali.

Jedním zezpůsobůch kódem je nastavit nastavení Zahrnout vyčištění chybějícího>>>> kódu pro Nastavte také možnost Odebrat nepoužívané položky včetně úrovně návrhu návrhu. Potom:

  1. V seznamu chyb se ujistěte, že je filtr nastavený na Build + IntelliSense.
  2. Vyhledejte instance obsahu z #include x se v tomto souboru používají a jsou přenášeny.
  3. Najeďte myší na čáru s návrhem. V rozevíracím seznamu žárovky vyberte Přidat všechny přechodně používané zahrnuje.
  4. Opakujte tyto kroky v projektu, dokud nebudou vyřešeny všechny návrhy týkající se přechodných zahrnutí.
  5. Odebrání nepoužívaných zahrnuje: v seznamu chyb vyhledejte instanci #include x se v tomto souboru nepoužívá.
  6. Najeďte kurzorem na nepoužívané záhlaví. V rozevíracím seznamu žárovky vyberte Odebrat všechny nepoužité zahrnutí.
  7. Opakujte tyto kroky v projektu, dokud nebudou vyřešeny všechny návrhy pro vyčištění.

V tomto stručném přehledu jste se seznámili s tím, jak vám může pomoct odebrat nepoužívané hlavičky a přidat hlavičky, které byly nepřímo zahrnuty. To vám pomůže udržet kód čistý, potenciálně sestavovat rychleji a snižovat brittleness vašeho kódu.

Viz také

Konfigurace vyčištění zahrnutí C/C++ v sadě Visual Studio
Zahrnout zprávy o vyčištění