2016-11-02 6 views
1

Beim Versuch, eine extern bereitgestellte C++ Code-Basis zu kompilieren, ich habe ein verwirrendes Problem gestoßen:Unterstützt C++ globale Header zum Zeitpunkt der Kompilierung?

Mehrere der Header-Dateien fehlen #include <MyLibrary.h>, wo MyLibrary eine offensichtliche Abhängigkeit ist, die einfach fehlen, und verhindern Kompilierung.

Meine Frage ist: Gibt es beim Kompilieren von C++ - Code eine Möglichkeit, automatisch eine Abhängigkeits-Header-Datei aufzunehmen, ohne sie in jeder der .h/.cpp-Dateien enthalten zu müssen, wo sie benötigt wird? Mit anderen Worten, eine Möglichkeit, dem C++ - Präprozessor eine Liste von Header-Dateien zur Verfügung zu stellen, die beim Kompilieren des gesamten Quellcodes automatisch eingefügt werden.

Ich verstehe, dass dies wahrscheinlich eine sehr schlechte Idee ist, aber ich versuche zu bestimmen, ob der Code, den ich zur Verfügung gestellt wurde einfach gebrochen ist, oder wenn es eine Möglichkeit gibt, kompiliert werden, ohne jede Datei manuell zu reparieren Abhängigkeiten.

+0

Nicht, dass ich weiß. Vorschlag: Sind Sie sicher, dass Sie den richtigen Standard kompilieren und diese Bibliotheken installiert haben? – Asu

+1

1) C ist nicht C++ ist nicht C. 2) Ihre Frage ist nicht klar. Header sind ** Quellcode **. Sie werden zur Laufzeit nicht in irgendeiner Weise verwendet. Und '# include' ist die Standardmethode für die Verwendung externer Definitionen. Was denkst du sonst noch darüber nach? – Olaf

+1

In Visual Studio ist dies definitiv eine Möglichkeit, dies zu tun - es wird eine Datei (en) in allen .cpp-Dateien in einem Projekt enthalten. Es ist eine der Präprozessoroptionen. –

Antwort

3

Der C++ - Sprachstandard unterstützt keine globalen Header, sondern einzelne Compiler.

Es heißt gezwungen, einschließlich.

Mit Visual C++ ist es die Option /FI, und mit g ++ ist die Option -include.


Mit Visual C++ jedoch die übliche Art und Weise gemeinsame Header enthalten ist die in einer Datei stdafx.h und schließen Sie die Datei in jeder Übersetzungseinheit, zunächst einmal aufgerufen wird, enthält zu platzieren. Das ist Teil der vorkompilierten Header-Unterstützung von Visual C++. Es ist problematisch, da es die Vorverarbeitungsregeln ändert, wenn es aktiviert ist (und es standardmäßig in einem Visual Studio-Projekt aktiviert ist), sodass Standardcode möglicherweise nicht kompiliert wird, aber größere Builds erheblich beschleunigen können.

+2

Anonymer Downvoter: Bitte erläutern Sie Ihren Downvote, damit Leser Ihre Kommentare und Abstimmungen in Zukunft leichter ignorieren können. Vielen Dank. –

2

Ja, zumindest mit gcc und kompatiblen .: Verwenden Sie die Option -include. Siehe https://stackoverflow.com/a/3387518/3150802.

+0

Das ist eine wirklich schlechte Idee und widersetzt sich Build-Tools. – Olaf

+0

@Olaf Ich habe es nie benutzt, aber ich kann nicht sofort die Gültigkeit beider Ansprüche sehen. Kannst du es ausarbeiten? –

+0

Wie würde z.B. Scons erkennen die zusätzlichen Abhängigkeiten? Wenn Sie die Abhängigkeiten ändern, müssen Sie eine unerwartete Datei (die Build-Datei) bearbeiten, anstatt die, die tatsächlich betroffen ist (den Quellcode). Vieles ist das Gegenteil des wichtigen Prinzips der "geringsten Überraschung". – Olaf

Verwandte Themen