Konstanten per #define festlegen (ungeeignet aber üblich?)



  • ^^naja, ein #define ist wirklich konstant, wie auch π. eine double-variable kann vom programm geändert werden (auch wenn sie 'const' ist). also, was passt wohl besser?
    🙂



  • Also nun sind wieder alle drei Optionen offen. Also will ich mal konkret werden. Welche Möglichkeit würdet ihr wählen? Betrachtet bitte die drei Kommentare.

    #include <stdio.h>
    /* #define PI 3.1415f */
    
    int main()
    {
    /*	const double PI = 3.1415; */
    /*	double PI=3.1415; */
    	int radius;
    	double flaeche;
    	printf("Radius	Flaeche");
    	for(radius=1; radius<=10; radius++)
    		{
    			flaeche=PI*radius*radius;
    			printf("\n%i	%6.2f",radius,flaeche);
    		}
    	return 0;
    }
    


  • Katzenstreu schrieb:

    Welche Möglichkeit würdet ihr wählen? Betrachtet bitte die drei Kommentare.

    ich würde das #define nehmen, aber ohne ein 'f' hinten dran.
    🙂



  • Ich würde auch die #define Variante bevorzugen. Man muss sich klar machen, dass man dabei keine Nachteile in Sachen Typsicherheit hat, ganz im Gegenteil.
    Problematisch wäre ein #define nur, wenn du später irgendwo im Programm einen gleichnamigen Bezeichner benutzen willst, dann würde dieser vom Präprozessor ersetzt werden und du einen lustigen Fehler beim Kompilieren erhalten.



  • Tippgeber schrieb:

    Man muss sich klar machen, dass man dabei keine Nachteile in Sachen Typsicherheit hat...

    rischtisch, 3.1415 ist doch schon 'ne double-konstante. #define wird zu unrecht verteufelt, genauso wie 'goto'
    --> http://c-faq.com/fp/mpi.html
    🙂



  • Gut, auch wenn es okay ist #define zu verwenden, dann ist es wohl ungeeignet dort eine Rechenoperation hinein zu schreiben, weil diese bei jedem Einsetzten erneut ausgeführt wird.



  • Katzenstreu schrieb:

    Gut, auch wenn es okay ist #define zu verwenden, dann ist es wohl ungeeignet dort eine Rechenoperation hinein zu schreiben, weil diese bei jedem Einsetzten erneut ausgeführt wird.

    Das würde ich vom Compiler abhängig machen. Ich programmiere normal für den GCC und da mache ich mir um so etwas keine Gedanken, denn wenn es zur Kompilierzeit auflösbar ist, dann wird er das auflösen. Und andernfalls muss es sowieso bei jedem Vorkommen aufgelöst werden (zur Laufzeit).

    Man kann mit Makros schon viel gewinnen, da sie einem viel Arbeit durch das Generieren von Code ersparen können. Aber man muss sich auch klar machen, dass es Fallstricke gibt, z.B.

    #define MIN(a,b) ((a) < (b) ? (a) : (b))
    

    Man darf das Makro nicht mit MIN(++a, b) aufrufen, oder kann sich auf eine Überaschung gefasst machen, denn ++a wird zwei mal ausgewertet.

    Makros die Anweisungen erzeugen sollten immer mit einem do { /* code hier */ } while(0) verpackt werden.

    Die zwei Sachen sind so die wichtigsten. Und natürlich noch die dritte Regel: wenn möglich eine Funktion benutzen (die Regel gilt aber wohl eher für Compiler wie den GCC die gut im Optimieren sind).



  • Katzenstreu schrieb:

    Gut, auch wenn es okay ist #define zu verwenden, dann ist es wohl ungeeignet dort eine Rechenoperation hinein zu schreiben, weil diese bei jedem Einsetzten erneut ausgeführt wird.

    Kommt drauf an. Wenn der Compiler sieht, daß da ein konstanter Wert rauskommt, wird der zur Compiletime aufgelöst, da spielt's eigentlich keine Rolle.



  • Google doch einfach mal nach:

    c define typsicherheit const

    und klick ein paar Links an, dann siehst Du vielleicht etwas klarer.



  • Belli schrieb:

    Google doch einfach mal nach:
    c define typsicherheit const
    und klick ein paar Links an, dann siehst Du vielleicht etwas klarer.

    meinst du irgendeine spezielle seite?
    🙂


Anmelden zum Antworten