26

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

我应该如何从一些 C89 代码访问 M_PI?

4

4 回答 4

41

一个符合标准的库文件math.h不仅不需要,而且实际上不能默认定义M_PI。在这种情况下,“默认”意味着M_PI只能通过特定于编译器的技巧来定义,通常是通过使用保留标识符来定义未定义的行为。

只需自己定义常量(您可以M_PI自由使用名称,但如果您希望能够使用不符合标准的编译器编译代码,M_PI则必须首先检查尚未定义的代码)。为约定起见,不要定义M_PI为 pi(的近似值)以外的任何东西。

于 2011-02-15T19:12:29.103 回答
28

我会去

#ifndef M_PI
#    define M_PI 3.14159265358979323846
#endif
于 2011-02-15T18:37:44.560 回答
9

M_PIC 标准不需要它,它只是一个常见的扩展,所以如果你想成为标准,你不应该依赖它。但是,您可以轻松地为它定义自己#define的,上次我检查它是一个通用常量,所以没有太多混淆的空间。:)

于 2011-02-15T18:37:30.083 回答
9

我看不出这里有什么问题;-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
于 2011-02-15T20:56:20.930 回答