Präprozessor: Floating-Point zu Integer? (C++, Arduino)

#4981522
Lesenswert?

Kai schrieb:
> Mhh, ich dachte, "er" vereinfacht Konstanten?

Der Compiler kann das schon. In deinem Beispiel ist FLOATEGER ein double 
(wenn du float willst musst du ein 'f' anhängen) weil 1.23 ein double 
ist und nach den Konvertierungsregeln wird der int dann auch zu einem 
double. Wenn du einen bestimmten Typen willst kannst du immer noch einen 
Cast dran schreiben.
#4981589
Lesenswert?

Torsten R. schrieb:
> ja, in C++ kannst Du mit static_cast, den Typen eines Ausdrucks
> vorgeben:

Da kann man sich die ganzen #defines aber auch gleich sparen und 
stattdessen für alles echte Konstanten benutzen.

Sebastian V. schrieb:
> Kai schrieb:
>> Mhh, ich dachte, "er" vereinfacht Konstanten?
>
> Der Compiler kann das schon. In deinem Beispiel ist FLOATEGER ein double

Nein, es hat keinen Typ. Der ergibt sich erst später, nachdem das Makro 
ersetzt wurde. Das kann ggf. eben auch was unerwartetes sein, auch 
wenn's hier nicht so viele Möglichkeiten gibt. (short)FLOATEGER wäre 
z.B. vom Typ int und nicht etwa short, wie man annehmen könnte. Eben die 
typischen Makro-Probleme.
#4981954
Lesenswert?

Torsten R. schrieb:
> Kai schrieb:
>>
1
>> #define FLOAT 1.23
2
>> #define INT 2
3
>> #define FLOATEGER FLOAT * INT
4
>>
>>
>> ist FLOATEGER 2.46 oder 2 ?
>>
>> Kann ein float Ergebnis forciert werden?
>
> ja, in C++ kannst Du mit static_cast, den Typen eines Ausdrucks
> vorgeben:
>
>
1
> constexpr float Ergebnis = static_cast< float >( FLOATEGER );
2
>

Aber wenn er schon C++ benutzen (soll), dann sollte er den CPP auch 
gleich für diesen Zweck entsorgen! In modernem C++ wird der CPP (fast) 
nur noch für include verwendet:
1
constexpr float f = 1.23f;
2
constexpr int i = 2;
3
constexpr float f3 = f * i;

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