首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Visual Studio中,M_PI可以使用math.h,但不能使用cmath

在Visual Studio中,M_PI可以使用math.h,但不能使用cmath
EN

Stack Overflow用户
提问于 2011-07-03 23:37:28
回答 7查看 154.9K关注 0票数 104

我使用的是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,它就可以工作。你知道为什么会发生这种事吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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列表中较高的部分包含没有指定#definecmathmath.h是专门设计的,因此您可以使用现在更改的定义重新包含它,以添加M_PI等。但cmath并非如此。因此,在包含任何其他内容之前,您需要确保使用#define _USE_MATH_DEFINES。希望这能让你明白这一点:)

如前所述,如果不能做到这一点,只需包含您正在使用的非标准C/C++的math.h :)

Edite2:或者就像大卫在评论中指出的那样,只要让你自己成为一个定义值的常量,你就有了更可移植的东西:)

票数 126
EN

Stack Overflow用户

发布于 2014-02-20 00:52:44

请考虑将开关/D_USE_MATH_DEFINES添加到编译命令行,或在项目设置中定义宏。这会将符号拖到包含文件和源文件的所有可访问的暗角,从而使您的源文件在多个平台上保持干净。如果您为整个项目全局设置了它,您稍后将不会在新文件中忘记它。

票数 16
EN

Stack Overflow用户

发布于 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之前没有预编译头被拉入。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6563810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档