我正在使用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的近似值。
@Jason S:这仅是由于标准库实现不允许"污染"名称空间(即,必须仅根据标准使用保留的标识符)这一事实。
是这样吗?这将意味着C实现永远不能同时符合C89和C99,因为C99向该库添加了标识符。
@larsmans:C99小心地添加了为C89中的实现保留的标识符(特别是参见C89中的4.13 FUTURE LIBRARY DIRECTIONS部分)或未在C89中定义的新头文件。但是,在C89和C99之间存在一些库行为不同的特殊情况-例如strtod(),它必须处理C99中的十六进制浮点,而不能在C89中处理。
@FredFoo是正确的;不能同时符合C89和C99。这就是为什么我们有编译器开关来选择一个或另一个。 C89实现可以提供一些C99