使用M_PI和C89标准

时间:2011-02-15 18:34:59

标签: c math c89

我正在使用C并尝试访问常量M_PI(3.14159 ...)。我已导入math.h头文件,但M_PI常量仍未定义。通过对StackOverflow的一些搜索,我发现我需要在代码中添加#define _USE_MATH_DEFINES(参见下面的示例代码)。这在正常编译时工作正常,但我需要能够使用std=c89标志进行编译以完成我正在进行的工作。

如何从某些C89代码访问M_PI?

4 个答案:

答案 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)

C标准不要求

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