Automatisieren Sie das #include-Refactoring in C++

Ich habe ein großes Projekt mit Hunderten von Dateien. Und wie es bei C++-Projekten oft vorkommt, werden #includeDirektiven durcheinandergebracht. Ich möchte sie umgestalten, um die Übersichtlichkeit zu erhöhen, die Kompilierungszeit zu verkürzen und die Analyse zu vereinfachen.

Für jede .h-Datei möchte ich Folgendes sicherstellen:

  • Es hat #includenur Direktiven für Typen, die es verwendet
  • Aber es hat nur Vorwärtsdeklarationen von Typen, die als T*oder verwendet werdenT&

Für jede .cpp-Datei möchte ich Folgendes sicherstellen:

  • Es hat #includenur Direktiven für Typen, die es verwendet und die nicht bereits von anderen Headern enthalten sind (keine indirekten Einschlüsse, wenn möglich).

Ich suche nach einem Tool, das mir hilft, dieses Refactoring zu automatisieren. Im Moment kenne ich nur Tools, die dabei helfen, überflüssige Includes zu entfernen. Einige von ihnen sind:

  • PC-lint
  • schließen Sie ein, was Sie verwenden
  • cppclean
  • ProFactor IncludeManager

Aber ich kenne keine Tools, die mir helfen, notwendige Includes in .h-Dateien zu verschieben oder Includes durch Forward-Deklarationen zu ersetzen. Irgendwelche Ideen? Tools für Windows und Visual Studio werden bevorzugt.

Antworten (1)

Es scheint, als würde include-what-you-use (IWYU) tatsächlich das tun, was ich will. Obwohl es ein bisschen schwierig ist, es unter Windows zu verwenden. Aber es gibt sogar vorgefertigte Windows-Binärdateien , und die Betreuer versprechen , sie mit jeder neuen Version von clang zu aktualisieren.

Das wichtige Konzept hinter IWYU und seinen Vorschlägen, wie Sie Ihre Includes ändern können, ist "re-exporting", wie in docs angegeben . Grundsätzlich schlägt IWYU vor, eine Datei mit Deklaration für jede direkt verwendete Entität direkt in den Code aufzunehmen. Oder deklarieren Sie es vorwärts, wenn möglich. Es sei denn, die Entität wird bereits aus anderen inkludierten Dateien reexportiert, dh in diesem Fall könnte ihre Deklaration indirekt inkludiert werden.

Es hat einige Mühe gekostet, IWYU mit Dateien aus der Visual Studio 2010-Lösung arbeiten zu lassen, aber ich habe diese Optionen für herausgefunden include-what-you-use.exe:

include-what-you-use.exe ^
-I "%ProgramFiles(x86)%/Microsoft SDKs/Windows/v7.0A/Include" ^
-I "%ProgramFiles(x86)%/Microsoft Visual Studio 10.0/VC/include" ^
-I "<paths_to_all_your_other_included_dirs>" ^
-DWIN32 -DNDEBUG -D_WINDOWS -D_USRDLL ^
-w -x c++ -std=c++11 -fcxx-exceptions -fexceptions -fms-compatibility -fms-extensions -fmsc-version=1600 -Wno-invalid-token-paste ^
-include stdafx.h ^
-Xiwyu --verbose=2 -Xiwyu --transitive_includes_only ^
you_file.h

Die -include stdafx.hOptionen werden beim Analysieren von Headern benötigt, um implizit enthaltene Header wie std oder Qt bereitzustellen. Im Moment habe ich es nur mit .h-Dateien getestet, nicht mit .cpp-Dateien, aber es scheint ziemlich gut zu funktionieren, sobald Sie verstehen, was es tatsächlich tut. Wiki-Seiten sind wirklich hilfreich.

Hoffe, das wird jemandem helfen.

Genial, dein Befehl hat auf Anhieb funktioniert
Manchmal wünschte ich, ich könnte eine Antwort mehr als einmal positiv bewerten.