使用M_PI与C89标准

我使用C并尝试访问常量M_PI(3.14159 …)。 我已经导入了math.h头文件,但M_PI常量仍未定义。 通过一些searchStackOverflow我发现我需要添加#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 

C标准不要求M_PI ,它只是一个普通的扩展,所以如果你想成为标准的话,你不应该依赖它。 但是,你可以很容易地定义你自己的#define ,上次我检查它是一个普遍常数,所以没有太多混淆的空间。 :)

我没有看到问题在这里, -std = c89和_USE_MATH_DEFINES之间不存在不兼容性,一个定义编译器将编译的语言,另一个定义math.h的哪些部分被启用。

那些被启用的部分没有被定义为ISO C标准库的一部分 ,但这与标准C语言不同,语言和库在C中是分离的实体。它不低于C89标准如果你已经在自己的头文件中定义了自己的macros。

但是,我会build议你在命令行而不是在代码中定义macros:

 -std=c89 -D_USE_MATH_DEFINES 

如果遇到不定义M_PI的math.h实现,那么通过类似地使用命令行定义的macros,可以很容易地修改它,而无需修改代码:

 -std=c89 -DM_PI=3.14159265358979323846