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

now*_*wox 10 c gcc c11

我注意到M_PI没有c11.通过查看/usr/include/math.h我可以看到M_PI定义如果:

#if !defined(__STRICT_ANSI__) || ((_XOPEN_SOURCE - 0) >= 500)
...
#define M_PI 3.1415...
#endif 
Run Code Online (Sandbox Code Playgroud)

而且math.hglibc __STRICT_ANSI__中取而代之的是__USE_MISC.我完全迷失了.

介于两者之间的故事--std=c11和定义的常量是math.h什么?

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

顺便说一句,M_PI在定义c99gnu11...

mil*_*bug 13

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

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

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

  • @coin为什么要这么麻烦?要么你想要更多的东西,那么你使用带有扩展名的`-std = gnu99`,或者你不想要扩展,因为你想要可移植性并且不想意外地将自己限制在一个编译器中,在这种情况下你使用` - STD = c99`. (3认同)
  • @coin不应该--C99也没有定义`M_PI`. (2认同)

Bre*_*ale 5

如果您只想M_PI通过POSIX / XOPEN功能测试宏等寻找更全面的答案,则临时解决方案是:

#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif
Run Code Online (Sandbox Code Playgroud)

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

#define M_PI (3.14159265358979323846264338327950288)
Run Code Online (Sandbox Code Playgroud)

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

无论如何-有比可用资源更好的资源。