Wie kann ich Makros aus der Standard Library im Programm verwenden?
-
Hallo,
ich möchte das in math.h vorhandene Makro M_PI in meinen Programm verwenden. In Code::Blocks wird mir bei der Eingabe des Makronamens auch direkt der Wert angezeigt und ich kann auch mit "Find declaration of" direkt auf das Makro in math.h springen. Beim compilieren jedoch erhalte ich die Fehlermeldung "M_PI undeclared (first use in this function).Was mache ich falsch?
#include <stdio.h> #include <math.h> int main() { double radius = 5.0; double area = M_PI * radius * radius; printf("Area of the circle: %f\n", area); return 0; }
-
M_PI ist kein Standard der C-Bibliotheken, sondern eine Erweiterung. Bist du dir sicher, dass dein Toolkit das unterstützt?
Edit:
Für den Microsoft Compiler muss man das wohl explizit per Compilerschalter_USE_MATH_DEFINES
aktivieren:#define _USE_MATH_DEFINES // for C++ #include <cmath> #define _USE_MATH_DEFINES // for C #include <math.h>
-
-lm
-
@ledi Welchen Sprachstandard hast du in den Compileroptionen gewählt?
-
@DocShoe Nein, das bringt leider auch nichts. Ich verwende unter WIN den GNU GCC Compiler.
-
@Fragender Das bindet nur die Fließkommabibliothek dazu.
Wenn das passiert, ist der Compiler schon fertig.
-
@DirkB sagte in Wie kann ich Makros aus der Standard Library im Programm verwenden?:
@Fragender Das bindet nur die Fließkommabibliothek dazu.
Ja, sorry, ich wollte einfach nur mal einen Beitrag mit 3 Zeichen schreiben.
-
Klingt nach diesem Problem: https://stackoverflow.com/questions/29264462/m-pi-not-available-with-gcc-std-c11-but-with-std-gnu11
Nutzt du da eine der strikten ANSI-Sprachoptionen beim compilieren?
-
@DirkB ich habe in den Compilereinstellungen C11 aktiviert.
Das seltsame ist, dass mir die IDE die Macros bei Eingabe auflistet und ich mit "open declaration" auch direkt in die Datei math.h springen kann.
-
Dann such in der
math.h
Datei nach der Definition und guck, unter welchen Bedingungen das Makro definiert wird.
-
@ledi sagte in Wie kann ich Makros aus der Standard Library im Programm verwenden?:
M_PI
Also hier nach https://stackoverflow.com/questions/29264462/m-pi-not-available-with-gcc-std-c11-but-with-std-gnu11 (ggf. identische Frage ...) solltest du M_PI einfach selber definieren.
-
@DocShoe hier in math.h steht:
/* Traditional/XOPEN math constants (double precison) */ #ifndef __STRICT_ANSI__ #define M_E 2.7182818284590452354 #define M_LOG2E 1.4426950408889634074 #define M_LOG10E 0.43429448190325182765 #define M_LN2 0.69314718055994530942 #define M_LN10 2.30258509299404568402 #define M_PI. 3.14159265358979323846
-
@ledi sagte in Wie kann ich Makros aus der Standard Library im Programm verwenden?:
@DirkB ich habe in den Compilereinstellungen C11 aktiviert.
Das deutet darauf hin, dass es tatsächlich an dem liegt, was ich beschrieben habe. Ist so etwas wie GNU11 eine Option? Ansonsten kannst du auch immer so etwas wie
#ifndef M_PI #define M_PI 3.14159265358979323846 #endif
selber in deinen Code schreiben. Damit geht es auf jeden Fall, egal ob es das Makros schon gibt oder nicht,
-
@ledi sagte in Wie kann ich Makros aus der Standard Library im Programm verwenden?:
#define M_PI. 3.14
Wieso ist da ein Punkt bei M_PI?
-
@Fragender Sorry, den Punkt bei #define M_PI. hab ich wohl beim Kopieren irgendwie dazu gewurstelt.
Ich weiß dass ich das Makro auch selbst definieren kann, aber mir geht es dabei zu ermitteln warum ich es nicht aus der Library heraus bekomme.
-
@ledi sagte in Wie kann ich Makros aus der Standard Library im Programm verwenden?:
Ich weiß dass ich das Makro auch selbst definieren kann, aber mir geht es dabei zu ermitteln warum ich es nicht aus der Library heraus bekomme.
Lässt dich denn irgendetwas vermuten, dass meine Erklärung nicht zutrifft? Nochmal auf einen Punkt: C11 ist bei dieser Compilerversion wohl ziemlich strikt nach ANSI-Standard (soll es ja auch!) und der definiert kein M_PI. Steht ja auch buchstäblich in dem Code den du gezeigt hast:
#ifndef __STRICT_ANSI__
. Das wird bei C11 wohl gesetzt sein. Wenn du so etwas wie GNU11 als Sprachoption hast, müsste es gehen. Oder irgendeine andere Compileroption, die eine Feinauswahl der GNU Erweiterungen erlaubt (ich lese jetzt nicht die ganze Anleitung aller Compilerschalter). Oder halt sonst die Selbstdefinition.
-
@ledi sagte in Wie kann ich Makros aus der Standard Library im Programm verwenden?:
@DirkB ich habe in den Compilereinstellungen C11 aktiviert.
Aktiviere stattdessen gnu11
Das seltsame ist, dass mir die IDE die Macros bei Eingabe auflistet und ich mit "open declaration" auch direkt in die Datei math.h springen kann.
Das ist auch nur eine Funktion vom Editor.
Der iost unabhängig vom Compiler, bzw. weiß er auch nicht, was der Compiler bei den einzelnen Standards für Defines macht.