M_PI gcc --std=c11 不可用,但 --std=gnu11 不可用?
M_PI not available with gcc --std=c11 but with --std=gnu11?
我注意到 M_PI
在 c11
上不可用。通过查看 /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=c11
和 math.h
中定义的常量之间有什么故事?
在 debian
分布中我应该考虑哪个 libc
?
顺便说一下,M_PI
定义在 c99
和 gnu11
...
很简单: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。
我注意到 M_PI
在 c11
上不可用。通过查看 /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=c11
和 math.h
中定义的常量之间有什么故事?
在 debian
分布中我应该考虑哪个 libc
?
顺便说一下,M_PI
定义在 c99
和 gnu11
...
很简单: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。