2012-03-30 4 views
2

Angenommen, Sie haben 100s Quelldateidateien (.c oder .cpp), und Sie möchten einige Definitionen, Funktions-/Variablendeklarationen in jede von ihnen aufnehmen. Normalerweise verwenden Sie in C/C++ Header-Dateien für diesen Zweck. Aber in diesem Fall müssen Sie #include "header.h" in jede Quelldatei einfügen.Fügen Sie eine Header-Datei in jede Quelldatei ein

Nun meine Frage ist, gibt es eine Möglichkeit, eine Überschrift für alle Dateien ohne #include "header.h" in jeder der Datei enthalten, weil es sehr ermüdend sein wird, #include "header.h zu schreiben "für 100s von Quelldateien.

+1

Nein, aber Sie können ein Python-Skript schreiben diese in ca. 5 Minuten für Sie zu tun. – TJD

+0

@TJD, nein? Du kannst es definitiv * tun *. –

+0

@CarlNorum, interessant, ich wusste nicht, die Option -include – TJD

Antwort

6

Sie können die -include Flagge für Clang oder GCC verwenden. Vom man page:

-includeDatei

Prozess Datei als ob "#include "file"" erschien als die erste Zeile der primären Quelldatei. Das erste Verzeichnis, das nach Datei gesucht wird, ist das Arbeitsverzeichnis des Präprozessors statt das Verzeichnis, das die Hauptquelldatei enthält. Wenn dort nicht gefunden wird, wird im Rest der "#include "..."" Suchkette wie normal gesucht.

Wenn mehrere -include Optionen angegeben sind, werden die Dateien in der Reihenfolge angezeigt, in der sie in der Befehlszeile angezeigt werden.

Beispiel:

clang -include header.h -c file1.c 
clang -include header.h -c file2.c 
clang -include header.h -c file3.c 
clang -o app file1.o file2.o file3.o 

MSVC hat den /FI flag, was ähnlich ist.

+0

Ja, ich kompiliere nur mit entweder clang oder gcc. Aber ich kann kein Beispiel im Netz finden. Würde es dir etwas ausmachen, einen zu teilen? Vielen Dank. – pythonic

1

Sie können das nicht tun, obwohl Sie ein Skript für Sie schreiben könnten. Ein Skript, das alle Dateien aufnimmt und #include "header.h" oben schreibt. Bearbeiten: -include in gcc tut dies.

Was Sie jedoch brauchen, ist auf andere Weise durch die Compiler-Optionen erreichbar. In gcc mit -D.

Angenommen, Sie möchten die Definition DEBUG_LEVEL zu 2 in allen Ihren Quelldateien. Sie können dies einfach tun, indem gcc wie dies Aufruf:

gcc -DDEBUG_LEVEL=2 

Beachten Sie, dass in diesem Fall müßten Sie alle Ihre Projekte neu zu erstellen (was sowieso geschehen wäre, wenn man diese Definition in 1-Header-Datei geändert hatte von dem ALLE Quelldateien abhängen)

+0

Ja, ich weiß über die Option -D, aber es ist nur ein Ersatz für #define in der Kopfzeile. Normalerweise haben Sie auch andere Dinge in der Header-Datei, wie Deklarationen, Makros und so weiter. – pythonic

+0

@CarlNorum, yeah Das habe ich gerade verstanden! Ich aktualisiere – Shahbaz

0

Header-Dateien sind keine Definitionen - sie sind Deklarationen.

Sie setzen so wenig wie möglich ein - speichert die Compiler-Arbeit und auch Inter-Abhängigkeiten.

Sie können die Anzahl sogar noch weiter reduzieren, indem Sie Vorwärtsdeklarationen in diesen Headerdateien verwenden.

Wenn Sie clever sind, können Sie IDE bekommen, die Ihnen hilft, die Lücken zu füllen, anstatt Ihre Finger zu verletzen.

+0

"Header-Dateien sind keine Definitionen - sie sind Deklarationen" - sie sind in der Regel eine Mischung: Für Dinge, die ausführbaren Speicherplatz benötigen, sind sie Deklarationen, aber für Dinge wie Klassen, Vorlagen, Inline-Funktionen - Definitionen. Vorwärtsdeklarationen sind - IMHO - schlechte Praxis - Sie sollten einen zusätzlichen Vorwärtsdeklarationsheader bevorzugen, zum Beispiel die Standardbibliothek '' - auf diese Weise stellt die Hierarchie von Includes die Konsistenz und Eigentümerschaft der deklarierten Komponenten sicher - es stellt sicher, dass die Rekompilierung bei Typen funktioniert werden mit typdefs zu bestimmten Template-Instanziierungen ersetzt. –

+0

@TonyDelroy - Erklärungen sind Dinge, die sagen, dass Dinge passieren werden. Inline-Funktionen werden nicht unbedingt kompiliert! Wenn die '.cpp'-Datei sie benötigt, fügt der Compiler nur den Namen hinzu. Wenn Sie Deklarationen weiterleiten, sparen Sie viel Zeit beim Kompilieren und Entwickeln. Lesen Sie das Buch von * Scott Myers * über das Thema - es ist sehr selten, dass Sie eine Include-Datei für den zu kompilierenden Code benötigen. Schließlich muss jeder Code, der es verwendet, diesen Teil enthalten. Anderer Code, der diese Komponenten der Include-Datei nicht verwendet, kann sie nur mit Vorwärtsdeklarationen ignorieren. –

+0

@TonyDelroy IMO es ist eine schlechte Praxis für Header, dass der Client Header in einer bestimmten Reihenfolge enthält oder dass Header andere Header enthalten oder dass Header einfach monolithisch sind, anstatt in logische, gut gestaltete Module aufgeteilt zu werden. Um diese Dinge zu vermeiden, sind oft Vorwärtsdeklarationen notwendig. Und ich sehe nicht, wo der Nachteil mit Vorwärtsdeklarationen ist. – bames53

3

Ja, es wäre ermüdend.Deshalb verwenden Sie die Shell ...

Die folgende mystische Beschwörung wird genau das tun, was Sie in ein paar Tastenanschlägen fragen!

find ./ -name "*.c" -or -name "*.cpp" | xargs -n 1 sed -i '1 i #include <my_header.h>' 

Bogen bis in die mächtige Kraft von Unix, Heiden ...

+0

Sorry, ich konnte nicht anders ... – brice