Re: Preprocessor: Einbinden von Header Dateien
Martin Hofius <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Message-ID | <[email protected]> |
Hallo, Am Samstag, 25. Oktober 2008 schrieb Thomas Hertweck: > Folgendes Szenario: > > Es sei die folgende Verzeichnisstruktur gegeben: > > ./include > > |-> first.h > |-> second.h > > ./src > > |-> code.c > > Der Quellcode code.c bindet die Datei first.h ein, diese Datei wiederum > bindet die Datei second.h ein. Der Quellcode wird im Verzeichnis ./src [...] > > ./include > > |-> first.h > |-> second.h > > ./src > > |-> code.c > |-> second.h > > Die Frage ist nun, welche Datei second.h wird letztendlich verwendet, > wenn der Code im Verzeichnis ./src wiederum mit dem Befehl "gcc -I. > -I../include" usw. uebersetzt wird. Ich haette eigentlich erwartet, dass > es die lokale Datei second.h ist, die eingebunden wird. Dem ist > allerdings nicht so, wie auch die von gcc ausgegebenen Abhaengigkeiten > zeigen: > > code.o: code.c ../include/first.h ../include/second.h > Wenn Du second.h mit #include "second.h" IN DER first.h einbindest, dann sieht gcc vermutlich das Verzeichnis ../include als aktuelles Verzeichnis - und dann ist es doch evtl. richtig, die Datei eben aus genau diesem Verzeichnis einzubinden. Das hat dann nichts mit den Compileroptionen zu tun, sondern einfach damit, dass die äußere Datei (also first.h) einfach auch in diesem Verzeichnis ist. [...] > > Wenn ich ebenfalls eine lokale Kopie von first.h in ./src anlege, dann > wiederum funktioniert die Sache. Ich verstehe also, was passiert und wie > der Preprocessor die -I Optionen handhabt: er scheint beim Einbinden von Genau das ist ja dann die Wirkung: wenn Du first.h eben auch im src-Verzeichnis hast, nimmt er ja dann auch die darin eingebundene second.h eben aus diesem (dann aktuelle) Verzeichnis. [...] > > Die Frage ist nun: Bug oder Feature? Bzw. wer handhabt die Sache > korrekt, der Preprocessor oder makedepend? Gute Frage... Aber eigentlich finde ich das Verhalten schon ganz sinnvoll: wenn ich einen (Meta-)Header anlege, der hauptsächlich dazu dient, die vielen anderen Header einzubinden, dann will ich doch eigentlich damit auch die einzubindenden Dateien festlegen - und die sollten dann nicht davon abhängig sein, von wo aus dieser Sammelheader wiederum eingebunden wird. > > Gruesse, > Thomas > Gruß Martin