Symbolische Konstanten in anderen Typ umwandeln

OP #5473121
Lesenswert?

Hallo,

für meinen WS2812 Treiber habe ich etliche Berechnungen mit dem 
Präprozessor durchgeführt. Danach frage ich ab, ob das Ergebnis der 
Berechnung negativ geworden ist. In den Berechnungen fließt auch die 
Konstante F_CPU mit ein. Auf den Typ der Konstante habe ich leider 
keinen Einfluss, da diese dem Compiler mit übergeben wird.

Für mich ergibt sich folgendes Problem:

Funktioniert:
1
#define F_CPU   5L
2
#define ZAHL    8
3

4
#if ((F_CPU - ZAHL) < 0)
5
#error
6
#endif

Funktioniert leider nicht:
1
#define F_CPU   5UL
2
#define ZAHL    8
3

4
#if ((F_CPU - ZAHL) < 0)
5
#error
6
#endif

Gibt es irgendeine Möglichkeit den Typ der symbolischen Konstante zu 
ändern?

Gruß Andreas
#5473944
Lesenswert?

Andreas B. schrieb:
> user schrieb:
>> #define macht nur eine textuelle Ersetzung, somit hat das keinen
>> Typ
>
> In #if Derektiven kann der Präprozessor auch rechnen. Genau da scheint
> es mir so, als würde das Ergebnis als unsigned Interpretiert, sobald
> eine Konstante unsigned ist.

Das ist nicht nur dort so. Auch außerhalb des Preprozessors wird bei 
einer arithmetischen Operation zwischen unsigned int und signed int 
letzterer auch nach unsigned konvertiert und dann die Operation 
vorzeichenlos durchgeführt. Nur kann man außerhalb des Präprozessors 
casten, so dass beide Operanden signed sind. Der Präprozessor kennt aber 
keine Casts, deswegen geht das bei #if nicht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren