Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C89标准中使用M_PI_C_Math_C89 - Fatal编程技术网

在C89标准中使用M_PI

在C89标准中使用M_PI,c,math,c89,C,Math,C89,我正在使用C并试图访问常量m_PI 3.14159。。。。我已经导入了math.h头文件,但是M_PI常量仍然没有定义。通过对StackOverflow的一些搜索,我发现我需要将define\u USE\u MATH\u DEFINES添加到我的代码中,请参见下面的示例代码。这在正常编译时工作得很好,但是我需要能够使用std=c89标志编译我正在做的工作 如何从一些C89代码中访问MU PI?C标准不需要MU PI,它只是一个常见的扩展,所以如果您想成为标准,就不应该依赖它。然而,你可以很容易地

我正在使用C并试图访问常量m_PI 3.14159。。。。我已经导入了math.h头文件,但是M_PI常量仍然没有定义。通过对StackOverflow的一些搜索,我发现我需要将define\u USE\u MATH\u DEFINES添加到我的代码中,请参见下面的示例代码。这在正常编译时工作得很好,但是我需要能够使用std=c89标志编译我正在做的工作

如何从一些C89代码中访问MU PI?

C标准不需要MU PI,它只是一个常见的扩展,所以如果您想成为标准,就不应该依赖它。然而,你可以很容易地定义你自己的定义,上次我检查它是一个普适常数,所以没有太多的混淆空间

我会选择

伊夫德夫·穆皮 定义M_PI 3.14159265358979323846 恩迪夫
符合标准的库文件math.h不仅不需要,而且实际上默认情况下不能定义M_PI。在此上下文中,“默认情况下”意味着只能通过特定于编译器的技巧来定义M_PI,通常是通过使用保留标识符来定义未定义的行为


只要自己定义常量,就可以自由使用名称M_PI,但是如果希望能够使用不一致的编译器编译代码,必须首先检查M_PI是否尚未定义。根据惯例,不要将M_PI定义为PI的近似值以外的任何东西。

我看不出这里有什么问题;-std=c89和_USE_MATH_定义之间没有不兼容,一个定义编译器将编译的语言,另一个定义MATH.h的哪些部分被启用

启用的那些部分没有定义为ISO C标准库的一部分,但这与不是标准C语言不同,语言和库在C中是独立的实体。它与C89兼容程度不亚于在自己的标头中定义自己的宏

但是,我建议您在命令行而不是在代码中定义宏:

-std=c89 -D_USE_MATH_DEFINES
如果您曾经遇到一个不定义M_PI的math.h实现,那么通过类似地使用命令行定义的宏,无需修改代码即可轻松修复:

-std=c89 -DM_PI=3.14159265358979323846

@Jason S:这仅仅是因为标准库实现不允许污染名称空间,即必须按照标准只使用保留标识符。是这样吗?这意味着C实现永远不能同时符合C89和C99,因为C99会向库中添加标识符。@larsmans:C99会小心地添加保留给C89中实现的标识符,请参见C89中的第4.13节“未来库方向”,或C89中未定义的新头文件。然而,C89和C99之间存在一些库行为不同的极端情况-例如,strtod必须在C99中处理十六进制浮点,而不能在C89中处理。@FredFoo这是正确的;不可能同时符合C89和C99。这就是为什么我们有编译器开关来选择其中一个。C89实现可以提供一些C99特性作为一致性扩展;最明显的情况是允许程序调用C99函数,或者只要发出诊断,就使用long long。_use_*是glibc内部的一部分,仅定义为features.h,因为定义了一些公共特性测试宏。使用-D_GNU_SOURCE或更便于携带,-D_XOPEN_SOURCE=700或类似值。@R..:是OP在StackOverflow上的其他位置找到宏后决定使用该宏,但遗憾的是,他没有指定宏的位置。表示要定义_BSD_SOURCE或_XOPEN_SOURCE=500,或更通用的功能选择宏,而表示要定义_使用_MATH_DEFINES,因此我坚持使用后者只是为了兼容性;这个问题没有提到任何特定的编译器。