我正在使用 C 并试图访问常量 M_PI (3.14159 ...)。我已导入 math.h 头文件,但 M_PI 常量仍未定义。通过对 StackOverflow 的一些搜索,我发现我需要添加#define _USE_MATH_DEFINES
到我的代码中(参见下面的示例代码)。这在正常编译时工作正常,但我需要能够使用std=c89
标志编译我正在做的工作。
我应该如何从一些 C89 代码访问 M_PI?
一个符合标准的库文件math.h
不仅不需要,而且实际上不能默认定义M_PI
。在这种情况下,“默认”意味着M_PI
只能通过特定于编译器的技巧来定义,通常是通过使用保留标识符来定义未定义的行为。
只需自己定义常量(您可以M_PI
自由使用名称,但如果您希望能够使用不符合标准的编译器编译代码,M_PI
则必须首先检查尚未定义的代码)。为约定起见,不要定义M_PI
为 pi(的近似值)以外的任何东西。
我会去
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif
M_PI
C 标准不需要它,它只是一个常见的扩展,所以如果你想成为标准,你不应该依赖它。但是,您可以轻松地为它定义自己#define
的,上次我检查它是一个通用常量,所以没有太多混淆的空间。:)
我看不出这里有什么问题;-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