4 Stimmen

Überprüfung auf redundante eingebundene Header-Dateien

Gibt es eine Möglichkeit, alle überflüssigen Header-Dateien in einer C/C++-Quelldatei herauszufinden?

5voto

Secure Punkte 4170

Seien Sie sich bewusst, dass redundante Includes hier eine gute Sache sein können, da sie die Header-Dateien in sich selbst einschließen. D.h. wenn B A enthält und C sowohl B als auch A enthält:

headera.h

headerb.h
#include "headera.h"

headerc.h
#include "headerb.h"
#include "headera.h"

Man könnte argumentieren, dass die Einbeziehung von A in C überflüssig ist, da sie bereits durch die Einbeziehung von B gegeben ist. Aber tatsächlich macht sie C unabhängig von der inneren Struktur von B. Wenn man sie entfernt, wird C abhängig auf B, um A einzuschließen.

2voto

Jens Gustedt Punkte 74457

Ich verwende Doxygen (zusammen mit Graphviz), um das Include-Diagramm zu erhalten. Dann sind die "redundanten" Includes die transitiven Bögen, d.h. Bögen, die eine Abkürzung auf einem längeren Pfad einführen.

1voto

Jon L Punkte 273

Das ist eine ziemlich komplexe Frage. Sie kann auf zwei Arten interpretiert werden:

  1. Sie wollen #includes entfernen, die Ihnen nichts bringen.
  2. Sie sollten nach rekursiven Includes suchen.

1 ist wahrscheinlich nicht erforderlich. Includes liefern nur Informationen für den Compiler, sie sollten keine Allokation enthalten. Selbst wenn sie es tun und Sie es nicht tun, wird der Compiler dies überflüssig machen. Wenn Sie dies wirklich tun wollen, können Sie damit beginnen, Includes zu entfernen, von denen Sie glauben, dass Sie sie nicht brauchen, bis Sie "implicit declaration of..."-Fehler erhalten.

Bei 2 müssen Sie sich normalerweise keine Sorgen machen. Es ist ziemlich gängige Praxis, eine eindeutige #def zu verwenden, z.B.:

#ifndef __MY_LIB_H
#define __MY_LIB_H
...
#endif

Dies führt dazu, dass der Bibliothekskern weggelassen wird, wenn die Definition bereits vorhanden ist.

Wenn Sie alle oder die meisten Bibliotheken kontrollieren, können Sie die #ifndef zu:

#ifdef __MY_LIB_H
#error "Lib included recursively"
#else
...
#endif

0voto

Laz Punkte 5548

Sie können auch #ifdef verwenden, um es innerhalb eines Programms zu überprüfen. Hierfür muss Ihr Header eine bestimmte Variable enthalten. Wenn sie existiert, ist sie definiert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X