[C] Präprozessor #error mit Variable

ZeroCCC

wasn das?
ID: 46810
L
10 Mai 2006
1.728
130
Hallo,

vielleicht gibts hier ja ein C Gott ;) Ist eigentlich ein ganz einfaches "Problem", wobie ich mir aber nicht sicher bin ob das überhaupt geht. Ich definiere und berrechne mittels #define ein paar Wert. Wenn ein bestimmter Wert überschritten wird soll der Compiler ein Fehler ausspucken. Soweit ist das kein Problem, ich möchte aber diesen fehlerhaften Wert mit Ausgäben lassen...

Code Beispiel vereinfacht:

PHP:
#define TIMING_ERROR 50

#if(TIMING_ERROR > 20)
    #error Timer abweichung liegt bei TIMING_ERROR
#endif

Leider bekomm ich damit mit GCC nur:
../test.c:26:4: error: #error Timer abweichung liegt bei TIMING_ERROR
aber hätte gern "Timer abweichung liegt bei 50"

gibts da irgendwie die möglichkeit das zu Realisieren?

Das ganze ist jetzt nicht wirklich wichtig, aber es würde mich drotzdem interessieren ob es möglich ist und würde einiges vereinfachen.
 
Sowas ist nicht direkt möglich. Das Problem ist, daß alle #blabla-Direktiven vom Präprozessor verfrühstückt werden. Der läuft aber nur ein einziges mal über den Quelltext.

Im Klartext bedeutet das, daß der Präprozessor ein erstes mal über die #error-Direktive laufen müßte um TIMING_ERROR durch den String, der den Zahlenwert beschreibt, zu ersetzen und dann ein zweites mal, um die #error-Direktive auszuführen.

Ich habe mal von einem Buch gehört in dem ziemlich exzessiv von Meta-Programmierung mit Hilfe des Präprozessors gelabert wird. Aber ich kann mich nicht daran erinnern, wie dieses Buch heißt.

Wozu brauchst Du sowas?
 
Hrm ja... aber man kann zb auch sowas machen wie:

PHP:
#define WERT1 10
#define WERT2 (WERT1*10)

Daher hab ich gedacht da besteht irgendwie auch die möglichkeit mit #error Werte weiter zuverwenden. Geht aber scheinbar nicht. Hab gestern noch ein wenig rumprobiert... aber dabei ist nix rausgekommen.

Wozu ich das brauche? Das ganze ist ein C Programm für ein Microcontroller. Daher werden essentielle Einstellungen direkt in das Progamm eincompiliert und die werden mithilfe des Präprozessors gesetzt... und jetzt hab ich hier was takt/zeitkritisches was bei zu hohen Abweichungen unzuverlässig wird. Daher wollte ich bei zu hohen Abweichung gleich noch den nächstmöglichen Wert beim Kompilieren ausgeben, damit man ebend nicht selbst nachrechnen muss. Ich brauchs also nicht wirklich, wäre aber ebend praktisch.