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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.