Stephan E. schrieb:
> Ich bin bislang fälschlicherweise immer davon ausgegangen, daß das
> maneulle define den vorhandenen Wert überschreibt statt daß er dadurch
> gesetzt und dann eben nicht mehr überschrieben wird. Wieder was gelernt.
Ich bin mir nicht sicher, ob du das verstanden hast. Ein C-Makro wird
vom Präprozessor einfach im Quelltext ersetzt. Genauso wie Suchen &
Ersetzen im Texteditor. Auch #include arbeitet rein auf Quelltext-Ebene.
Die Anweisung wird durch den Inhalt des Includefiles ersetzt.
Das passiert genau einmal. Bei der Expansion wird von einem Makro immer
die gerade gültige Definition verwendet. Wenn es keine gibt, dann wird
das Makro einfach gar nicht expandiert. Es ist auch möglich (aber
seltenst sinnvoll) ein Makro mehrfach, gar unterschiedlich zu
definieren. Dann wird es an verschiedenen Stellen des Quellcodes nämlich
entsprechend unterschiedlich expandiert. Der Präprozessor weist darauf
auch deutlich mit seiner Warnung hin.
Z.B. in diesem "Programm"
1 | #define F_CPU 1000000UL
|
2 | #include "foo.h"
|
3 |
|
4 | #define F_CPU 128000UL
|
5 | #include "bar.h"
|
Wird an allen Stellen, wo Code in foo.h sich auf F_CPU bezieht, der Wert
1000000UL verwendet. In bar.h dann allerdings 128000UL. Bei dem zweiten
#define wirft der Präprozessor eine Warnung.
Das ist ziemlich genau deine Konstellation. Außer daß das erste #define
in delay.h steckt. Da wird nämlich am Anfang geschaut, ob F_CPU
überhaupt gesetzt ist. Und wenn nicht, setzt delay.h es selber. Hier:
less /usr/lib/avr/include/util/delay.h
1 | #ifndef F_CPU
|
2 | /* prevent compiler error by supplying a default */
|
3 | # warning "F_CPU not defined for <util/delay.h>"
|
4 | # define F_CPU 1000000UL
|
5 | #endif
|
Wenn du sehen willst, was der Präprozessor aus deinem .c File macht, gib
dem Compiler auf der Kommandozeile ein --save-temps mit. Dann findest du
zu jedem <file>.c ein <file>.i mit der Ausgabe des Präprozessors.