Werden defines zur Laufzeit berechnet?



  • Hi

    Ich habe eine kurze Frage.

    Wird soetwas:

    #define cos( 180 )
    

    vom Compiler in

    #define -1
    

    umgewandelt?
    Ich denke zwar nicht aber wie sieht es dann z.B. mit folgendem aus:

    #define 15/10
    

    ?

    mfg

    stein



  • #defines werden nur vom Preprocessor beachtet und sind ein Textersetzung - nicht mehr und nicht weniger.

    Danach läuft der Kompiler druch. Der Kompiler kann cos(180) nicht schon berechenen, da eine Funktion aufgerufen wird. Jedoch werden die beiden Ganzzahl Literale 15/10 schon zur Kompilierzeit berechtnet.

    Simon


  • Mod

    simon.gysi schrieb:

    Der Kompiler kann cos(180) nicht schon berechenen, da eine Funktion aufgerufen wird.

    Das besagt nichts, insbesondere deshalb nicht, weil es sich um eine Funktion der Standardbibliothek handelt. Natürlich ist die Frage nach dem "Vorausberechnen" gar nicht so sinnvoll, wie sie auf den ersten Blick erscheinen mag. Das, was dem in C++ am nächsten kommt, sind konstante Ausdrücke. cos(180) ist kein konstanter Ausruck (und hat sowieso nicht den Wert -1); 1.0+2.0 allerdings auch nicht, wobei es keinen zwingenden Grund gibt, weshalb der Compiler hier nicht schlau genug sein sollte, sofort 3.0 als Wert zu ermitteln.
    15/10 wiederum ist ein konstanter Ausdruck mit dem Wert 1.
    Im Zusammenhang mit #define ist die Frage allerdings tatsächlich sinnlos: da es sich um reine Texterersetzung handelt, kommt es an dieser Stelle gar nicht zu einer Auswertung bzw. Wertermittelung.



  • das ganze kann man auch mal testen, indem man sich den quellcode nach der präprozessorbearbeitung mal anschaut. Einfach den richtigen parameter des entsprechenden compilers heraussuchen, und compilieren.



  • Wenn ich mich recht erinnere ist doch in die neueste Version des GCC eine Bibliothek eingeflossen, die diese ganzen mathematischen Ausdrücke inklusive cos, sin, pow und was weiß ich nicht alles schon zur Compilezeit auswertet.

    Ich glaub dazu stand was auf heise oder so.



  • The-Kenny schrieb:

    ...die diese ganzen mathematischen Ausdrücke inklusive cos, sin, pow und was weiß ich nicht alles schon zur Compilezeit auswertet...

    Wie jetzt ... "alles [...] ausgewertet" oder "nicht alles [...] ausgewertet" ?
    😕

    Wieder mal eine Situation, die FÜR den Gebrauch von Satzzeichen spricht...
    :p

    Gruß,

    Simon2.



  • Ja, beim GCC werden diese Ausdrücke zur Compilierzeit ausgewertet.

    Übrigends: cos(180) = -0.59846...



  • Ponto schrieb:

    Ja, beim GCC werden diese Ausdrücke zur Compilierzeit ausgewertet.

    Übrigends: cos(180) = -0.59846...

    Ich frage mich auch, wie camper hier auf 3 gekommen ist. Es kann ja höchstens 1 werden.. 🙄



  • drakon schrieb:

    Ponto schrieb:

    Ja, beim GCC werden diese Ausdrücke zur Compilierzeit ausgewertet.

    Übrigends: cos(180) = -0.59846...

    Ich frage mich auch, wie camper hier auf 3 gekommen ist. Es kann ja höchstens 1 werden.. 🙄

    Lies dir campers Beitrag noch mal ganz genau durch. 🙂



  • Ponto schrieb:

    drakon schrieb:

    Ponto schrieb:

    Ja, beim GCC werden diese Ausdrücke zur Compilierzeit ausgewertet.

    Übrigends: cos(180) = -0.59846...

    Ich frage mich auch, wie camper hier auf 3 gekommen ist. Es kann ja höchstens 1 werden.. 🙄

    Lies dir campers Beitrag noch mal ganz genau durch. 🙂

    Hmm. Ok. Ich habe das nicht so bildlich gelesen, wie er es gemeint hat. (vor allem die .0 haben mich vom "ein und zwei zusammenzählen" abgelenkt. 😉

    Nix für ungut. 🙂


Anmelden zum Antworten