M_PI gcc --std=c11 不可用,但 --std=gnu11 不可用?

M_PI not available with gcc --std=c11 but with --std=gnu11?

我注意到 M_PIc11 上不可用。通过查看 /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_PI 定义在 c99gnu11...

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

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

GCC 4.9 when used with -std=c99 doesn't define M_PI, but does when used with -std=gnu99

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

因此,如果您想定义自己的 M_PI 宏,#if 守卫会保护您免受问题的困扰。 gcc 正在做正确的事情。标准头文件不应该随意定义不在标准中的宏。

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

#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif

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

#define M_PI (3.14159265358979323846264338327950288)

往返精度的“1.35”格式。这意味着如果你想打印出一个浮点双精度数,并在你读回它时恢复相同的值,你应该对 printf 函数使用“%+1.16”,依此类推。你可能会说 double 没有 17 位有效数字,但如果你想恢复一个值,这些数字不是 'junk'。

无论如何 - 有比这更好的资源 available