我正在使用C并尝试访问常量M_PI(3.14159 ...)。我已导入math.h头文件,但M_PI常量仍未定义。通过对StackOverflow的一些搜索,我发现我需要在代码中添加#define _USE_MATH_DEFINES
(参见下面的示例代码)。这在正常编译时工作正常,但我需要能够使用std=c89
标志进行编译以完成我正在进行的工作。
如何从某些C89代码访问M_PI?
答案 0 :(得分:38)
不仅要求符合标准的库文件math.h
,而且实际上默认情况下 不能定义M_PI
。在此上下文中,“默认情况下”意味着M_PI
必须仅通过特定于编译器的技巧来定义,通常通过使用保留标识符来定义未定义的行为。
只需自己定义常量(您可以自由使用名称M_PI
,但是如果您希望能够使用不合格的编译器编译代码,则必须先检查M_PI
是否为{尚未定义)。为了惯例,不要将M_PI
定义为pi(近似值)以外的任何内容。
答案 1 :(得分:25)
我会去
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
答案 2 :(得分:9)
M_PI
,它只是一个常见的扩展,所以如果你想成为标准,你就不应该依赖它。但是,您可以轻松地为它定义自己的#define
,上次我检查它是一个通用常量,因此没有太多的混淆空间。 :)
答案 3 :(得分:8)
我没看到这里的问题是什么; -std = c89和_USE_MATH_DEFINES之间没有不相容性,一个定义了编译器将编译的语言,另一个定义了math.h的哪些部分被启用。
启用的那些部分未定义为ISO C标准库的一部分,但这与不是标准C语言不同,语言和库是C中的独立实体。与您在自己的标头中定义自己的宏一样,它与C89兼容。
但我建议您在命令行而不是代码中定义宏:
-std=c89 -D_USE_MATH_DEFINES
如果您遇到没有定义M_PI的math.h实现,那么通过类似地使用命令行定义的宏,可以轻松修复而无需修改代码:
-std=c89 -DM_PI=3.14159265358979323846