我注意到M_PI
上c11
不可用。通过查看/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
?
顺便说一下,debian
和M_PI
中定义了c99
...
答案 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正在做正确的事情。标准头文件不应随意定义不在标准中的宏。