cmath problem
-
hallo,
bei einem programm wollte ich die konstante pi einbinden. habe dann herrausgefunden das ich dazu die header <cmath> einbinden muss. ausserdem muss noch folgendes vor <cmath> eingeben werden: #define _USE_MATH_DEFINES
wofür brauch man das #define _USE_MATH_DEFINES?
auf funktionen in <cmath> kann man odch auch ohne #define _USE_MATH_DEFINES zugreifen!
wär cool wenn mir jemand weiterhelfen könnte!
danke!
mfg
-
Ist der Name des Makros nicht offensichtlich?
-
Ich habe das zwar noch nie gesehen oder verwendet aber aus dem Namen bedeutet es folgendes: Benutze die #defines, die im header cmath definiert sind.
-
ich weiss wie man makros definiert...aber hier definieren wir ja quasie unser eigenes makro. allerdings sagen wir ja garnicht was es machen soll.
sorry wenn ich so blöd fragen stelle....aber ich habe noch an eingen stellen verständnisproblem. c++ ist doch schon sehr anders wie java.
-
x-rey schrieb:
allerdings sagen wir ja garnicht was es machen soll.
Nichts soll es machen. Es soll einfach nur sein.
-
Es geht dabei um eine Reihe von Makros, die im C++-Standard nicht definiert sind, sondern aus anderen, ergänzenden Spezifikationen stammen. M_PI konkret stammt aus BSD.
Der Hintergrund für _USE_MATH_DEFINES und ähnliche Schalter ist, dass der C++-Standard neben den Bezeichnern der Standardbibliothek und Schlüsselworten nur solche Bezeichner explizit für die Implementation reserviert, die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen oder zwei Unterstriche direkt hintereinander enthalten (und im globalen Namensraum zusätzlich alle anderen, die mit einem Unterstrich beginnen). Man kann das so auslegen, dass die Implementation andere Bezeichner in Standardheadern nicht belegen darf, obwohl diese Interpretation meines Wissens nur von Microsoft tatsächlich gefahren und ich mir nicht sicher bin, wie konsequent das da durchgehalten wird. Streng nach Standard wäre etwa
#include <cmath> int main() { double M_PI = 3.14159265358979; }gültiger Code. Wenn <cmath> aber ungefragt M_PI definiert, kommt das beim Compiler (ungefähr) als
*Inhalt von <cmath> hier* int main() { double 3.14159265358979 = 3.14159265358979; }an, was natürlich einen Compilerfehler provoziert.
Im Interesse portabler Programmierung bietet sich übrigens an, _USE_MATH_DEFINES in den Projekteinstellungen und nicht im Code direkt zu verdrahten, da andere Plattformen dieses Makro nicht kennen oder gar (auch wenn das unwahrscheinlich ist) für andere Zwecke benutzen können.