Konstanten per #define festlegen (ungeeignet aber üblich?)
-
Hallo,
ich arbeite ein paar Aufgaben durch und schrieb ein Programm, welches eine Tabelle ausgibt. Links der Radius von 1 bis 10 und daneben die Kreisfläche. Ich definierte Pi so:
double PI=3.1415;
In der Musterlösung wird stattdessen
#define PI 3.1415f
verwendet.
Ich wollte wissen, was an #define besser ist, als diese Konstante als Variable abzuspeichern. Nun habe ich etwas gesucht und gelesen, dass diese Methode altmodisch ist. Ein Vorteil von Konstanten oder Preprozessorbefehlen scheint zu sein, dass diese Werte im gesamten Programmablauf nicht veränderlich sind. Habe ich damit alles richtig zusammen gefasst? Also verwende ich anstelle von #define und Variablen möglichst const? Ich denke, dass ich beim Erstellen dieses Beitrags meine Frage einigermaßen selber beantwortet habe. Falls alles richtig ist, reicht mir ein kurzes "okay" deinerseits :).
Grüße,
Tim
-
okay! Falls Du const anstelle von Makros benutzen kannst, hast Du zusätzlich den Vorteil von Typsicherheit.
-
Stimmt, das vergaß ich zu übernehmen. Danke! Kann ich dieses Thema als "Erledigt" markieren oder macht ihr das hier nicht?
-
^^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?