M_PI nicht verfügbar mit gcc --std = c11 aber mit --std = gnu11?

9

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:

%Vor%

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 ...

definiert     
nowox 25.03.2015, 19:10
quelle

3 Antworten

11

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

verwendet     
milleniumbug 25.03.2015, 19:14
quelle
4

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:

%Vor%

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 .

    
Brett Hale 25.03.2015 20:06
quelle
3

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.

    
juhist 25.03.2015 19:14
quelle

Tags und Links