我使用的是Visual Studio 2010。我在C++中读到过,使用<cmath>
比使用<math.h>
更好。
但在我尝试编写的程序(Win32控制台应用程序,空项目)中,如果我写道:
#define _USE_MATH_DEFINES
#include <math.h>
它会编译,而如果我编写
#define _USE_MATH_DEFINES
#include <cmath>
它失败了,错误为
错误标识符:'M_PI‘:未声明的标识符
正常吗?我使用cmath还是math.h有关系吗?如果是,我怎样才能使它与cmath一起工作?
更新:如果我在图形用户界面中定义了_USE_MATH_DEFINES,它就可以工作。你知道为什么会发生这种事吗?
发布于 2011-07-03 23:58:48
有趣的是,我在我的一个应用程序上检查了这个,我得到了同样的错误。
我花了一段时间检查头文件,看看是否有什么东西未定义_USE_MATH_DEFINES
,但什么也没有找到。
所以我移动了
#define _USE_MATH_DEFINES
#include <cmath>
作为我文件中的第一件事(我不使用#include "stdafx.h"
,所以如果你使用PCH,那么你必须在PCH之后使用它),突然它就完美地编译了。
试着把它移到页面的更高位置。完全不确定为什么这会引起问题。
编辑:解决了这个问题。#include <math.h>
发生在cmath的头保护中。这意味着#includes列表中较高的部分包含没有指定#define
的cmath
。math.h
是专门设计的,因此您可以使用现在更改的定义重新包含它,以添加M_PI
等。但cmath
并非如此。因此,在包含任何其他内容之前,您需要确保使用#define _USE_MATH_DEFINES
。希望这能让你明白这一点:)
如前所述,如果不能做到这一点,只需包含您正在使用的非标准C/C++的math.h
:)
Edite2:或者就像大卫在评论中指出的那样,只要让你自己成为一个定义值的常量,你就有了更可移植的东西:)
发布于 2014-02-20 00:52:44
请考虑将开关/D_USE_MATH_DEFINES添加到编译命令行,或在项目设置中定义宏。这会将符号拖到包含文件和源文件的所有可访问的暗角,从而使您的源文件在多个平台上保持干净。如果您为整个项目全局设置了它,您稍后将不会在新文件中忘记它。
发布于 2011-07-03 23:42:41
这对我来说很有效:
#define _USE_MATH_DEFINES
#include <cmath>
#include <iostream>
using namespace std;
int main()
{
cout << M_PI << endl;
return 0;
}
像应该:cl /O2 main.cpp /link /out:test.exe
一样编译和打印pi
。
你发布的代码和你试图编译的代码一定不匹配。
确保在您的#define
之前没有预编译头被拉入。
https://stackoverflow.com/questions/6563810
复制相似问题