Hallo zusammen,
kennt jemand eine Möglichkeit, den Präprozessor konstante Potenzen
berechnen zu lassen? Konkret suche ich etwas wie:
1
#define N_DIGITS 3
2
3
void fcn(uint16_t a) {
4
a %= pow(10,NDIGITS);
5
...
6
}
um den konstanten Term auf der rechten Seite schon im Präprozessor
ausrechnen zu können. Wenn ich das richtig sehe, gibt es ja keinen
Exponnentialoperator und keine Schleifen.
Viele Grüße
Nicolas
A. K. schrieb:> Der Präprozessor rechnet nicht. Ausnahme: der Operand in #if.
OK, laß es mich präzisieren: Mit Präprozessormagie dafür sorgen, daß der
GCC Konstanten daraus macht. OK, ich könnte es für sinnvolle Werte
einfach mit einer switch-case-Tabelle machen. Aber ist das schön?
#define N 3
#define CAT(a,b) a##b
#define CAT2(a,b) CAT(a,b)
CAT2(10e,N) => 10e3
Ist es das, was du willst?
Anonsten werden Compiler u.U. konstante Ausdrücke bereits selbst
berechnen. Nicht selten sogar dann, wenn bekannte Mathefunktionen wie
exp() dazu gehören.
"constexpr" zwingt den Compiler die Werte beim Compilieren auszurechnen.
Funktioniert außerdem auch zur Laufzeit. So vermeidet man den
Präprozessor komplett mit allen seinen Fallen & Nachteilen...
## verkettet die Parameter ohne Leerzeichen zwischendrin.
Eine zweistufige Staffelung der CAT Makros ist erforderlich, weil sonst
Makros als Parameter nicht aufgelöst werden. CAT(10e,N) führt zu 10eN.