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

时间:2015-03-25 19:10:29

标签: c gcc c11

我注意到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的{​​{1}}被__STRICT_ANSI__取代。我完全迷失了。

__USE_MISC--std=c11中定义的常量之间的故事是什么?

我应该在math.h分发中考虑哪个libc

顺便说一下,debianM_PI中定义了c99 ...

3 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:4)

如果您只是想在使用POSIX / XOPEN功能测试宏等寻找更全面的答案时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函数,如此。您可能会说双倍不具有17位有效数字,但这些数字不是“垃圾”数字。如果你想恢复一个值。

无论如何 - 资源比available更好。

答案 2 :(得分:3)

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

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