Mailinglist Archive: opensuse-programming-de (8 mails)

< Previous Next >
[opensuse-programming-de] Preprocessor: Einbinden von Header Dateien
  • From: Thomas Hertweck <Thomas.Hertweck@xxxxxx>
  • Date: Sat, 25 Oct 2008 13:25:24 +0100
  • Message-id: <49031034.2020605@xxxxxx>

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
mit dem Befehl "gcc -I. -I../include" usw. uebersetzt - das funktioniert
wie erwartet.

Nun arbeitet jemand am Quellcode und macht eine lokale Kopie der Datei
second.h, um dort z.B. ein weiteres Makro zu definieren. Die
Verzeichnisstruktur sieht dann wie folgt aus:

./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

Meine Compilierung schlaegt daher fehl, da meine Aenderungen in der
lokalen second.h in ./src nicht bekannt sind. Lasse ich mir
Abhaengigkeiten mit makedepend generieren, so verhaelt es sich anders:

code.o: code.c ../include/first.h second.h

Damit ist zwar dann die Abhaengigkeit wie ich sie erwartet haette, aber
das Compilieren schlaegt natuerlich nachwievor fehl, da dort ja der
Preprocessor zum Einsatz kommt und die "falsche" Datei einbindet.

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
Header Dateien in anderen Header Dateien nicht wieder alle
Verzeichnisse, die ueber -I spezifiziert sind, durchzugehen. Das finde
ich etwas seltsam.

Die Frage ist nun: Bug oder Feature? Bzw. wer handhabt die Sache
korrekt, der Preprocessor oder makedepend?

Gruesse,
Thomas

PS: System ist opensuse 10.3 mit gcc 4.2.1 und makedepend aus
xorg-x11-util-devel 7.2.
--
To unsubscribe, e-mail: opensuse-programming-de+unsubscribe@xxxxxxxxxxxx
For additional commands, e-mail: opensuse-programming-de+help@xxxxxxxxxxxx

< Previous Next >
List Navigation