M_PI不适用于gcc –std = c11但是–std = gnu11?

我注意到c11上的M_PI不可用。 通过查看/usr/include/math.h我可以看到M_PI定义如果:

 #if !defined(__STRICT_ANSI__) || ((_XOPEN_SOURCE - 0) >= 500) ... #define M_PI 3.1415... #endif 

另外在math.h , glibc __STRICT_ANSI__被替换为__USE_MISC 。 我完全迷失了。

--std=c11math.h定义的常量之间的故事是什么?

我应该在debian发行版中考虑哪个libc

顺便说一句, M_PIc99gnu11定义……

这很简单: M_PI没有在标准C中定义。如果您想要符合标准,请提供您自己的定义。

C编译器不能在不破坏合法C程序的情况下引入这样的常量(名称不是保留的,可以用作标识符),因此,它们仅被定义为扩展名。

-std=c99一起使用时,GCC 4.9不定义M_PI ,但与-std=gnu99

如果您只是想在使用POSIX / XOPENfunction测试宏等寻找更全面的答案时使用M_PI ,那么临时解决方案是:

 #ifndef M_PI #define M_PI (3.14159265358979323846) #endif 

这是“1.20”格式,对于80位扩展类型的“往返”表示也是足够的。 双精度为“1.16”。 对于128位四倍精度:

 #define M_PI (3.14159265358979323846264338327950288) 

往返精度的“1.35”格式。 这意味着如果要打印出双点浮点数,并在读回时恢复相同的值,则应使用“%+ 1.16”作为printf函数,如下所示。 您可能会说double没有17位有效数字,但如果您想要恢复某个数字,那么这些数字不是“垃圾”。

无论如何 – 有比这更好的资源。

M_PI宏未由C11标准定义: http : //www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf

因此, #if警卫可以保护您免受问题的影响,以防您想要定义自己的M_PI宏。 gcc正在做正确的事情。 标准头文件不应随意定义不在标准中的宏。