Verwendung von M_PI mit C89-Standard

Lesezeit: 3 Minuten

Ich verwende C und versuche, Zugriff auf die Konstante M_PI (3.14159 …) zu erhalten. Ich habe die Header-Datei math.h importiert, aber die M_PI-Konstante war noch nicht definiert. Durch einige Suche auf StackOverflow habe ich festgestellt, dass ich hinzufügen muss #define _USE_MATH_DEFINES zu meinem Code (siehe Beispielcode unten). Dies funktioniert beim normalen Kompilieren gut, aber ich muss in der Lage sein, mit dem zu kompilieren std=c89 Flagge für die Arbeit, die ich mache.

Wie sollte ich von einem C89-Code aus auf M_PI zugreifen?

Benutzer-Avatar
gleich

Eine konforme Standardbibliotheksdatei math.h ist nicht nur nicht erforderlich, sondern tatsächlich darf nicht definieren M_PI standardmäßig. In diesem Zusammenhang bedeutet “standardmäßig” das M_PI muss nur durch Compiler-spezifische Tricks definiert werden, meistens undefiniertes Verhalten durch die Verwendung von reservierten Bezeichnern.

Definieren Sie die Konstante einfach selbst (Sie können den Namen verwenden M_PI frei, aber wenn Sie den Code mit einem nicht konformen Compiler kompilieren möchten, müssen Sie dies zuerst überprüfen M_PI ist noch nicht definiert). Definieren Sie der Konvention halber nicht M_PI als etwas anderes als (die Annäherung an) pi.

  • @Jason S: Es ist einfach eine Folge der Tatsache, dass die Implementierung der Standardbibliothek den Namensraum nicht “verschmutzen” darf (dh standardmäßig nur reservierte Bezeichner verwenden darf).

    – gleich

    16. Februar 2011 um 17:42 Uhr

  • Ist das so? Das würde bedeuten, dass eine C-Implementierung niemals gleichzeitig C89- und C99-konform sein kann, da C99 der Bibliothek Bezeichner hinzufügt.

    – Fred Foo

    7. März 2012 um 11:11 Uhr

  • @larsmans: C99 achtet darauf, Bezeichner hinzuzufügen, die der Implementierung in C89 vorbehalten waren (siehe insbesondere Abschnitt 4.13 ZUKÜNFTIGE BIBLIOTHEKSRICHTUNGEN in C89) oder in neuen Header-Dateien, die nicht in C89 definiert wurden. Es gibt jedoch einige Eckfälle unterschiedlichen Bibliotheksverhaltens zwischen C89 und C99 – zum Beispiel strtod() die in C99 mit hexadezimalen Gleitkommazahlen umgehen müssen und in C89 nicht können.

    – Café

    7. März 2012 um 11:27 Uhr

  • @FredFoo Das ist richtig; eine gleichzeitige Konformität mit C89 und C99 ist nicht möglich. Deshalb haben wir Compilerschalter, um das eine oder andere auszuwählen. Eine C89-Implementierung kann einige C99-Funktionen als konforme Erweiterungen bereitstellen; Die offensichtliche Situation besteht darin, dem Programm zu erlauben, C99-Funktionen aufzurufen oder zu verwenden lang Lang (solange eine Diagnose ausgegeben wird).

    – Kas

    12. September 2018 um 22:14 Uhr


Benutzer-Avatar
Sven Marnach

Ich würde gehen

#ifndef M_PI
#    define M_PI 3.14159265358979323846
#endif

M_PI wird vom C-Standard nicht benötigt, es ist nur eine gängige Erweiterung, wenn Sie also Standard sein wollen, sollten Sie sich nicht darauf verlassen. Sie können jedoch leicht Ihre eigenen definieren #define Das letzte Mal, als ich es überprüft habe, war es eine universelle Konstante, daher gibt es nicht viel Platz für Verwirrung. :)

Ich verstehe nicht, was hier das Problem ist; es gibt keine Inkompatibilität zwischen -std=c89 und _USE_MATH_DEFINES, eines definiert, welche Sprache der Compiler kompilieren wird, das andere definiert, welche Teile von math.h aktiviert werden.

Die aktivierten Teile sind nicht als Teil des ISO-C-Standards definiert Bibliothekaber das ist nicht dasselbe wie nicht die Standard-C-Sprache zu sein, Sprache und Bibliothek sind separate Einheiten in C. Es ist nicht weniger C89-konform, als wenn Sie Ihre eigenen Makros in Ihrem eigenen Header definiert hätten.

Ich würde jedoch vorschlagen, dass Sie das Makro in der Befehlszeile und nicht im Code definieren:

-std=c89 -D_USE_MATH_DEFINES

Wenn Sie jemals auf eine math.h-Implementierung stoßen, die M_PI nicht definiert, kann dies ohne Codeänderung leicht behoben werden, indem Sie auf ähnliche Weise befehlszeilendefinierte Makros verwenden:

-std=c89 -DM_PI=3.14159265358979323846

1362040cookie-checkVerwendung von M_PI mit C89-Standard

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy