Forum: Compiler & IDEs Präprozessor #if Vergleich


von Laber K. (laberkeks010)


Lesenswert?

Hallo,

möchte in meinem Quelltext prüfen, ob F_CPU definiert ist gleichzeitig 
sicherstellen, dass dieser auf die gewünschte Frequenz eingestellt ist.

Dazu:
1
/* F_CPU definiert? Falls nicht, setzte es auf 32e6UL. */
2
#ifndef F_CPU
3
#define F_CPU 32e6UL
4
#endif
5
6
/* Falls F_CPU defeniert (in anderern Header Dateien), prüfe ob F_CPU==32e6UL. */
7
#if (F_CPU != 32e6)
8
#error F_CPU ist ungleich 32e6
9
#endif

Beim der Zeile
1
#if (F_CPU != 32e6)
bekomme ich den Fehler
1
floating constant in preprocessor expression

Was mache ich falsch?

von Peter II (Gast)


Lesenswert?

du brauchst den 2. check überhaupt nicht.

lege es im makescript fest und nicht in den Header Dateien! Wenn jetzt 
im Quellcode jemand verscuht das Define anzulegen oder auf einen anderen 
wert zu setzen bekommt man einen fehler.

von Karl H. (kbuchegg)


Lesenswert?

Laber Keks schrieb:
> Hallo,
>
> möchte in meinem Quelltext prüfen, ob F_CPU definiert ist gleichzeitig
> sicherstellen, dass dieser auf die gewünschte Frequenz eingestellt ist.

Es zeigt sich immer öfter, dass dies scheinbare Sicherung ein Boomerang 
ist.

Wenn F_CPU nicht im makefile oder den Project Options definiert ist, 
dann sollte man das tatsächlich als Fehler werten und keinen Default 
machen. Das Nachtragen ist kein Aufwand und es vermeidet 
Fehlersituationen in denen unterschiedliche C-Files unterschiedliche 
Werte für F_CPU benutzen.

von (prx) A. K. (prx)


Lesenswert?

Laber Keks schrieb:
> floating constant in preprocessor expression
> Was mache ich falsch?

Steht das nicht deutlich genug da? Der Präprozessor kann nicht mit 
Fliesskommawerten rechnen.

von xfr (Gast)


Lesenswert?

Peter II schrieb:
> du brauchst den 2. check überhaupt nicht.

Ich würde sagen, er braucht den ersten Check nicht (bzw. ist sogar 
kontraproduktiv). Wenn das danach folgende Programm davon abhängt, dass 
32 MHz eingestellt sind, ist der zweite Check schon sinnvoll.

Du musst einfach 32000000UL statt 32e6 schreiben, denn 32e6 ist eine 
Fließkommazahl und kein Integer.

von Rolf Magnus (Gast)


Lesenswert?

xfr schrieb:
> Du musst einfach 32000000UL statt 32e6 schreiben

Um die Zahl der Nullen besser erkennen zu können, kann man's auch so 
schreiben:
1
#define F_CPU (32UL * 1000 * 1000)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.