M_PI适用于math.h,但不适用于Visual Studio中的cmath

我正在使用Visual Studio 2010.我已经阅读了C ++,最好使用<cmath>而不是<math.h>

但在我正在编写的程序(Win32控制台应用程序,空项目),如果我写:

 #define _USE_MATH_DEFINES #include <math.h> 

它编译,而如果我写

 #define _USE_MATH_DEFINES #include <cmath> 

它失败了

错误C2065:'M_PI':未声明的标识符

这是正常的吗? 如果我使用cmath或math.h,这有什么关系吗? 如果是的话,我怎样才能使用cmath工作?

更新 :如果我在GUI中定义_USE_MATH_DEFINES,它将起作用。 任何线索为什么发生这种情况?

有趣的是我检查了我的一个应用程序,我得到了同样的错误。

我花了一段时间检查标题,看是否有什么东西没有find_USE_MATH_DEFINES,什么都没发现。

所以我感动了

 #define _USE_MATH_DEFINES #include <cmath> 

成为我文件中的第一件事(我不使用PCH,所以如果你是你将不得不在#include“stdafx.h”后),并突然编译完美。

尝试在页面上方移动它。 完全不确定为什么这会导致问题。

编辑 :找出来。 #include发生在cmath的头文件中。 这意味着#include的列表中的更高的东西包括没有指定的#define的cmath。 math.h是专门devise的,所以你可以再次包含它定义现在改变添加M_PI等。这不是与cmath的情况。 所以你需要确保你#define _USE_MATH_DEFINES之前,包括其他任何东西。 希望能为你解决:)

如果不包括math.h,那么您已经使用了非标准的C / C ++了:)

编辑2 :或者,正如David在注释中指出的那样,只要让自己定义一个常量,并且你有一些更便携的东西:)

考虑将开关/ D_USE_MATH_DEFINES添加到编译命令行,或者在项目设置中定义macros。 这会将符号拖放到包含文件和源文件的所有可到达的黑暗angular落,从而将源代码清理为多个平台。 如果您在整个项目中全局设置,那么稍后您将不会在新文件中将其遗忘。

这适用于我:

 #define _USE_MATH_DEFINES #include <cmath> #include <iostream> using namespace std; int main() { cout << M_PI << endl; return 0; } 

编译和打印pi应该是: cl /O2 main.cpp /link /out:test.exe

在你发布的代码和你正在编译的代码中必须有一个不匹配的地方。

确保在#define之前没有预编译头文件。