Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Vanaf Visual Studio 17.8 Preview 1 biedt Visual Studio een #include opschoonfunctie waarmee de kwaliteit van uw code op de volgende manieren wordt verbeterd:
Visual Studio biedt een #include opschoonfunctie waarmee de kwaliteit van uw code op de volgende manieren wordt verbeterd:
- Aanbiedingen voor het toevoegen van headerbestanden voor code die alleen worden gecompileerd omdat een benodigd headerbestand indirect wordt opgenomen door een ander headerbestand.
- Aanbiedingen voor het verwijderen van ongebruikte headerbestanden, waardoor de buildtijden en code netheid worden verbeterd.
Inclusief opschoning is standaard uitgeschakeld. Zie Config C/C++ Include Cleanup in Visual Studio voor meer informatie over het configureren ervan.
Directe versus indirecte headers
Enkele terminologie:
- Een rechtstreekse kop is een kop die u expliciet
#includein uw code opgeeft. - Een indirecte header wordt opgenomen omdat een koptekst die u rechtstreeks opneemt, deze bevat. U kunt ook zeggen dat een indirecte header is opgenomen
transitively.
"Include Cleanup analyseert uw code en bepaalt welke headers niet worden gebruikt en welke indirect zijn opgenomen." Houd rekening met het volgende headerbestand:
// myHeader.h
#include <string>
#include <iostream>
void myFunc()
{
std::string s = "myFunc()\n";
std::cout << s;
}
En het programma dat het gebruikt:
// 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 is een directe header omdat myProgram.cpp deze expliciet is opgenomen.
myHeader.h bevat <string> en <iostream>, dus dit zijn indirecte headers.
Het probleem is dat myProgram.cpp gebruikt std::string en std::cout, maar niet rechtstreeks de headers bevat die deze definiëren. Deze code wordt gecompileerd omdat myHeader.h deze headers bevat. Deze code is kwetsbaar omdat als myHeader.h ooit zou stoppen met het opnemen van een van beide, myProgram.cpp niet meer zou compileren.
Volgens de C++-richtlijnen is het beter om expliciet headers op te nemen voor al uw afhankelijkheden, zodat uw code niet onderhevig is aan broosheid die wordt veroorzaakt door wijzigingen in headerbestanden. Zie SF.10 voor meer informatie over de richtlijn: Vermijd afhankelijkheden van impliciete #included-namen in de C++-kernrichtlijnen.
Inclusief Opschonen analyseert uw code om ongebruikte en indirect opgenomen headers te identificeren. Het biedt feedback op basis van de instellingen die worden beschreven in het hulpprogramma C++ #include in Visual Studio. De feedback wordt geleverd in de vorm van waarschuwingen en suggesties in de lijst met fouten. Zie Include Cleanup-berichten voor meer informatie over de door Include Cleanup gegeven feedback.
Ongebruikte headers
Naarmate uw code zich ontwikkelt, hebt u mogelijk geen headerbestanden meer nodig. Het is moeilijk om deze headers in een complex project bij te houden. Na verloop van tijd kunnen uw builds langer duren omdat de compiler onnodige headerbestanden verwerkt.
Met Opschonen kunt u ongebruikte headers zoeken en verwijderen. Wat gebeurt er bijvoorbeeld als u myFunc() in myProgram.cpp uitcommentarieert:
// 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
}
In de volgende schermopname wordt #include "myHeader.h" gedimd weergegeven (een instelling die wordt beschreven in Het hulpprogramma C++ #include configureren in Visual Studio), omdat dit niet langer nodig is sinds myFunc() in commentaar is gezet.
Beweeg de muisaanwijzer over het vervaagde #include om het snelle actiemenu weer te geven. Selecteer de gloeilamp (of kies de koppeling Potentiële oplossingen weergeven) om acties te bekijken die betrekking hebben op het ongebruikte bestand:
Transitief gebruikte headers toevoegen
U kunt ervoor kiezen om het ongebruikte headerbestand te verwijderen, maar die actie breekt de code omdat <string> en <iostream> indirect zijn opgenomen in myheader.h.
In plaats daarvan kunnen we alle tijdelijke gebruikte gegevens toevoegen en alle ongebruikte #includes verwijderen. Hiermee verwijdert u de ongebruikte koptekst myHeader.h, maar voegt u ook eventuele headers toe die indirect worden gebruikt via myHeader.h. Het resultaat in dit geval is het toevoegen van #include <string> en #include <iostream> aan myProgram.cpp en het verwijderen van #include "myHeader.h".
// 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();
}
Het hulpprogramma werkt de opmerkingen niet bij, maar u kunt zien dat de code nu std::string en std::cout rechtstreeks gebruikt. Deze code is niet langer broos omdat deze niet afhankelijk is van het opnemen van myHeader.h de andere vereiste headers.
Aanbevolen procedure
Verwijder niet wat ongebruikte headerbestanden lijken te zijn zonder eerst indirect opgenomen headerbestanden toe te voegen. Uw code kan afhankelijk zijn van indirecte insluitingen in een headerbestand dat anders niet wordt gebruikt. Voeg als eerste transitief gebruikte headers toe. Wanneer u ongebruikte headers verwijdert, krijgt u geen compilatiefouten als gevolg van ontbrekende headerbestanden die indirect zijn opgenomen door een headerbestand dat u hebt verwijderd.
Een manier om dit te doen is:
- Stel de instelling voor Include-opruiming voor Suggestieniveau voor ontbrekende includes toevoegen in op Suggestie (Extra>Opties>Teksteditor>C/C++>Code opschonen).
- Stel het suggestieniveau voor het verwijderen van ongebruikte includes in op Suggestie.
Een manier om dit te doen is:
- Stel de vervolgkeuzelijst voor de instelling Include-opschoning voor Kies hoe ontbrekende #include-instructies die transitief worden opgenomen, worden gemarkeerd in op Suggestie (Extra>Opties>Alle instellingen>Talen>C/C++>Code opschonen>Include-opschoning).
- Stel Kies hoe u ongebruikte #include-instructies markeert in op Suggestie.
Daarna kunt u het volgende doen:
- Zorg ervoor dat in de foutlijst het filter is ingesteld op Build + IntelliSense.
- Zoek naar gevallen waarin "Inhoud van #include x wordt gebruikt in dit bestand en transitief inbegrepen."
- Beweeg de muisaanwijzer over een lijn met de suggestie. Selecteer In de vervolgkeuzelijst met gloeilampen alle tijdelijke gebruikte items toevoegen.
- Herhaal deze stappen in uw project totdat alle suggesties met betrekking tot transitieve insluitingen zijn opgelost.
- Verwijder ongebruikte includes: zoek in de lijst met fouten naar een voorbeeld van '#include x wordt niet gebruikt in dit bestand'.
- Plaats de cursor op de ongebruikte koptekst. Selecteer in de gloeilamp-dropdown Alle ongebruikte includes verwijderen.
- Herhaal deze stappen in uw project totdat alle Include-opruimsuggesties zijn afgehandeld.
In dit korte overzicht hebt u gezien hoe Include Cleanup u kan helpen ongebruikte headerbestanden te verwijderen en headerbestanden toe te voegen die indirect waren opgenomen. Dit proces helpt u uw code schoon te houden, mogelijk sneller te bouwen en vermindert de broosheid van uw code.
Zie ook
Configureer het opschonen van C/C++ includebestanden in Visual Studio
Opschoningsberichten opnemen