我正在使用 Visual Studio 2010。我读过在 C++ 中最好使用 <cmath>
而不是 <math.h>
。
但是在我尝试编写的程序中(Win32 控制台应用程序,空项目),如果我这样写:
#define _USE_MATH_DEFINES
#include <math.h>
它编译,而如果我写
#define _USE_MATH_DEFINES
#include <cmath>
它失败了
正常吗?我使用 cmath 还是 math.h 有关系吗?如果是,我怎样才能让它与 cmath 一起工作?
UPDATE :如果我在 GUI 中定义 _USE_MATH_DEFINES ,它就可以工作。任何线索为什么会发生这种情况?
最佳答案
有趣的是,我在我的一个应用程序上检查了这个,我得到了同样的错误。
我花了一段时间检查标题,看看是否有任何未定义的 _USE_MATH_DEFINES
并没有发现任何东西。
所以我移动了
#define _USE_MATH_DEFINES
#include <cmath>
成为我文件中的第一件事(我不使用 PCH,所以如果你是,你必须在
#include "stdafx.h"
之后使用它),然后它突然编译完美。尝试将其向上移动到页面上方。完全不确定为什么这会导致问题。
编辑 :想通了。
#include <math.h>
出现在 cmath 的头部保护中。这意味着在#includes 列表中更高的部分包括 cmath
,但没有指定 #define
。 math.h
是专门设计的,因此您可以再次包含它,现在定义更改为添加 M_PI
等。 cmath
不是这种情况。因此,在包含其他任何内容之前,您需要确保 #define _USE_MATH_DEFINES
。希望可以为您解决问题:)如果仅包含
math.h
,则您正在使用非标准 C/C++,正如已经指出的那样:)Edit 2 :或者正如大卫在评论中指出的那样,让自己成为一个定义值的常量,无论如何你都有更便携的东西:)
关于c++ - M_PI 适用于 math.h 但不适用于 Visual Studio 中的 cmath,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6563810/