Ich habe festgestellt, dass M_PI
auf c11
nicht verfügbar ist. Wenn ich auf /usr/include/math.h
schaue, kann ich sehen, dass M_PI
definiert ist, wenn:
Darüber hinaus in der math.h
von glibc __STRICT_ANSI__
wird durch __USE_MISC
ersetzt. Damit bin ich völlig verloren.
Was ist die Geschichte zwischen --std=c11
und den in math.h
definierten Konstanten?
Welche libc
sollte ich bei einer debian
Verteilung berücksichtigen?
Übrigens ist M_PI
in c99
und gnu11
...
Es ist einfach: M_PI
ist nicht in Standard C definiert. Geben Sie Ihre eigene Definition an, wenn Sie standardkonform sein wollen.
C-Compiler können solche Konstanten nicht einfügen, ohne legale C-Programme zu brechen (der Name ist nicht reserviert und könnte als Bezeichner verwendet werden), und als solche werden sie nur als Erweiterung definiert.
GCC 4.9 bei Verwendung mit -std=c99
definiert nicht M_PI
, sondern wird bei Verwendung mit -std=gnu99
Wenn Sie nur M_PI
möchten, während Sie nach einer umfassenderen Antwort mit POSIX / XOPEN-Feature-Test-Makros usw. suchen, ist eine Übergangslösung:
Das ist das "1,20" -Format, das auch für eine "Round-Trip" -Darstellung für einen erweiterten 80-Bit-Typ ausreicht. doppelte Genauigkeit ist "1,16". Für 128-Bit-Quad-Präzision:
%Vor%Das Format "1.35" für die Rundlaufgenauigkeit. Das bedeutet, wenn Sie einen Gleitkomma-Double ausgeben und denselben Wert wiederherstellen möchten, sollten Sie "% + 1.16" für printf-Funktionen verwenden. Sie könnten sagen, dass ein Double nicht 17 signifikante Ziffern hat, aber diese Ziffern sind nicht "Junk", wenn Sie einen Wert wiederherstellen möchten.
Wie auch immer - es gibt bessere Ressourcen als diese verfügbar .
Das Makro M_PI
ist nicht durch den C11-Standard definiert: Ссылка
Daher schützen die #if
-Wächter Sie vor Problemen, falls Sie Ihr eigenes Makro M_PI
definieren möchten. gcc macht genau das Richtige. Die Standard-Header sollten nicht willkürlich Makros definieren, die nicht im Standard enthalten sind.