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
之前没有预编译头文件。