präprozessr anweisung vs typedef vs const



  • hey leute,

    bin gerade etwas durcheinander.

    Würde ich in einem C-Programm Beispielsweise eine Zahl wie PI=3,1415.. etc verwenden, wie soll ich diese in das Programm einbinden?

    Mir fallen drei verschiedene Möglichkeiten ein:

    #define PI 3,1415

    const float PI = 3,1415;

    typedef 3,1415 PI;

    kann mir evtl einer von euch den Unterschied bzw die Vor- und Nachteile verdeutlichen?

    gruß 🙂



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • #define PI 3,1415
    

    Das ist so, als hättest du überall wo PI steht, 3,1415 geschrieben. Deshalb sind Klammern um den Ersetzungstext sehr zu empfehlen, der Präprozessor ist nicht sehr schlau.

    const float PI = 3,1415;
    

    Dann ist PI immer die gleiche Variable, mit Adresse, hundert extern's usw. Nach der überlieferten Sprechweise sollte man sowas nicht vollständig gross schreiben, sonst wird's von den Lesern mit 1.) verwechselt.

    typedef 3,1415 PI;
    

    Das ist ein Syntax-Fehler.
    🙂



  • Übrigens sind alle 3 falsch, denn Pi ist 3.1416.
    🙂



  • µngbd schrieb:

    #define PI 3,1415
    

    Das ist so, als hättest du überall wo PI steht, 3,1415 geschrieben. Deshalb sind Klammern um den Ersetzungstext sehr zu empfehlen, der Präprozessor ist nicht sehr schlau.

    der Präprozessor denkt nicht, er kann gar nicht schlau sein, denn er macht eine 1:1 Textersetzung vor dem tatsächlichen Kompilervorgang.

    Bie solchen numerischen Sachen wird in C den typedef Weg bevorzugt. Wobei ich heute eher enums verwende:

    enum somename {
      PI=3.14159265
    };
    


  • supertux schrieb:

    der Präprozessor denkt nicht, er kann gar nicht schlau sein, denn er macht eine 1:1 Textersetzung vor dem tatsächlichen Kompilervorgang.

    Aber ein wenig schlauer hätte man den schon machen können. ZB um jede Ersetzung Klammern machen, wenn man dadurch die Syntax nicht bricht.
    🙂



  • supertux schrieb:

    Bie solchen numerischen Sachen wird in C den typedef Weg bevorzugt. Wobei ich heute eher enums verwende:

    enum somename {
      PI=3.14159265
    };
    

    Geht enum auch mit floats? Das wäre eigentlich eine feine Sache.
    🙂



  • Hi,

    MatheStein schrieb:

    hey leute,

    bin gerade etwas durcheinander.

    Würde ich in einem C-Programm Beispielsweise eine Zahl wie PI=3,1415.. etc verwenden, wie soll ich diese in das Programm einbinden?

    Machs doch mit

    #include <math.h>
    

    Pi und andere bekannte Konstanten ist meist in der oben genannten Datei als M_PI definiert:

    #define M_PI 3.14159265358979323846
    

    Sollte mit den meisten Compilern funzen. Den MSVC muss man allerdings erst mit

    #define _USE_MATH_DEFINES
    

    überreden:

    #include <stdio.h>
    #define _USE_MATH_DEFINES // Vor math.h definieren. Kann man auch gut in den Projekteinstellungen verstecken. :)
    #include <math.h>
    
    int main() { 
    	printf("%lf\n", M_PI);		 
    	return 0;
    }
    

    Aloha,
    B.B.



  • µngbd schrieb:

    supertux schrieb:

    Bie solchen numerischen Sachen wird in C den typedef Weg bevorzugt. Wobei ich heute eher enums verwende:

    enum somename {
      PI=3.14159265
    };
    

    Geht enum auch mit floats?

    Natürlich nicht.



  • supertux schrieb:

    enum somename {
      PI=3.14159265
    };
    
    enum somename 
    {
      PI=3.14159265,
      PI_PLUS_ONE,    // 4.14159265
    };
    

    ^^ *fg*
    🙂



  • µngbd schrieb:

    supertux schrieb:

    Bie solchen numerischen Sachen wird in C den typedef Weg bevorzugt. Wobei ich heute eher enums verwende:

    enum somename {
      PI=3.14159265
    };
    

    Geht enum auch mit floats? Das wäre eigentlich eine feine Sache.
    🙂

    Ich hab ehrlich gesagt noch nie ausprobiert und hab gar nicht dran gedacht, als ich den Beitrag schrieb. 🙄

    µngbd schrieb:

    supertux schrieb:

    der Präprozessor denkt nicht, er kann gar nicht schlau sein, denn er macht eine 1:1 Textersetzung vor dem tatsächlichen Kompilervorgang.

    Aber ein wenig schlauer hätte man den schon machen können. ZB um jede Ersetzung Klammern machen, wenn man dadurch die Syntax nicht bricht.
    🙂

    aber dann bist du der Schlaue, der den Präpro. überlistest.



  • Ich bin für diese Lösung:

    enum {pi = 3, e = 3};
    

    Macht alles viel einfacher.



  • also mal ehrlich konstante werte gehören einfach in ein #define und nicht in ne variable oder sonstwas da braucht man sich doch nicht darüber unterhalten man kann sich evtl. darüber unterhalten ob pi/2 in ne variable kommt oder nicht normal übernimmt das aber auch der compiler...

    meiner meinung sind enums und unions unnötig hab sie auch noch nie verwendet und hab das auch nicht vor



  • Bashar schrieb:

    µngbd schrieb:

    Geht enum auch mit floats?

    Natürlich nicht.

    Warum eigentlich nicht?

    noobLolo schrieb:

    man kann sich evtl. darüber unterhalten ob pi/2 in ne variable kommt oder nicht

    Nö, dafür gibt's M_PI_2.
    🙂



  • supertux schrieb:

    Ich hab ehrlich gesagt noch nie ausprobiert und hab gar nicht dran gedacht, als ich den Beitrag schrieb. 🙄

    Wieso schreibst du dann, dass du das selbst so machst? Du simulierst dadurch eine fundierte Aussage.



  • µngbd schrieb:

    Bashar schrieb:

    µngbd schrieb:

    Geht enum auch mit floats?

    Natürlich nicht.

    Warum eigentlich nicht?

    Weil enums durch ganze Zahlen repräsentiert werden. Syntaktisch mag das so gehen, aber da wird dann 3.14159 in 3 konvertiert.



  • Hmm, also ich habe unions und enums schon gebraucht.
    Und ich halte wenig davon Variablen per defines zu definieren, ich halte const-Variablen da für sinnvoller, weil es so typabhängig ist, aber das kann natürlich auch ein Nachteil sein. Aber wahrscheinlich ist es egal.



  • nwp2 schrieb:

    Hmm, also ich habe unions und enums schon gebraucht.
    Und ich halte wenig davon Variablen per defines zu definieren, ich halte const-Variablen da für sinnvoller, weil es so typabhängig ist, aber das kann natürlich auch ein Nachteil sein. Aber wahrscheinlich ist es egal.

    Es geht ja auch nicht um Variable, sondern um echte, echt konstante Werte. Die sind in den Standardlibs nunmal als defines abgelegt.
    const- Vars machen eigentlich nur Sinn, wenn Du dem Compiler sagen kannst, daß er sie im ROM ablegen soll (sonst kopiert der Startupcode sie ins RAM um) und Du die paar gesparten Bytes wirklich brauchst. Das dödelige extern ist der Preis dafür, den man dann zu zahlen hat.

    Aber darf ja jeder programmieren, wie er will ... 😃



  • nwp2 schrieb:

    Und ich halte wenig davon Variablen per defines zu definieren

    das geht ja auch nicht. aber konstanten kannste mit #define anlegen, die sind dann wirklich so richtig konstant.

    nwp2 schrieb:

    ...ich halte const-Variablen da für sinnvoller

    ich z.b. verwende 'const' total selten, fast nie.
    🙂



  • µngbd schrieb:

    Nö, dafür gibt's M_PI_2

    ich denke ich sollte mal die math.h genauer unter die lupe nehmen 🙂


Anmelden zum Antworten