c-M_PI不适用于gcc--std=c11,但适用于--std=gnu11



我注意到M_PIc11上不可用。通过查看/usr/include/math.h,我可以看到M_PI被定义为:

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

此外,在来自glibc的math.h中,__STRICT_ANSI____USE_MISC取代。我完全迷失了方向。

--std=c11math.h中定义的常量之间的关系是什么?

debian分布中,我应该考虑哪个libc

顺便说一下,M_PI是在c99gnu11中定义的。。。

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

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

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

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

#ifndef M_PI
#define M_PI (3.14159265358979323846)
#endif

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

#define M_PI (3.14159265358979323846264338327950288)

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

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

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

因此,如果您想定义自己的M_PI宏,#if保护程序将保护您免受问题的影响。gcc正在做正确的事情。标准标头不应任意定义不在标准中的宏。

相关内容

最新更新